1 About this primer

Ever since the first genome-wide association study (GWAS) on age-related macular degeneration, and the promise of personalized medicine in the wake of the Human Genome Project, large-scale genetic association studies hold significant sway in contemporary health research and drive drug-development pipelines. In the past 2 decades, researchers delved into GWAS, aiming to unveil genetic variations linked to both human traits, such as the color of your eyes, and rare and common complex diseases. These findings serve as crucial keys to unravel the intricate mechanisms underlying diseases, shedding light on whether the correlations identified in observational studies between risk factors and diseases are truly causal.

These studies have ushered in an exciting era where many researchers thrive on developing new methods and bioinformatic tools to parse ever-growing large datasets collected large population-based biobanks. However, the analyses of these data are challenging and it can be daunting to see the forest for tree among the many tools and their various functions. Enter A Practical Primer in Human Complex Genetics. This GitBook was originally written back in 2022 for the Genetic Epidemiology course organized by the Master Epidemiology of Utrecht University. This practical guide will teach you how to design a GWAS, perform quality control (QC), execute the actual analyses, annotate the GWAS results, and perform further downstream post-GWAS analyses. Throughout the book you’ll work with ‘dummy’, that is fake, data, but in the end, we will use real-world data from the first release of the Welcome Trust Case-Control Consortium (WTCCC) focusing on coronary artery disease (CAD).

A major component of modern-day GWAS is genetic imputation, but for practical reasons it is not part of this book. However, I will provide some pointers as to how to go about do this with minimal coding or scripting experience. Likewise, the courses does not cover the aspects of meta-analyses of GWAS, but some excellent resources exist to which I will direct. As this practical primer evolves, these and other topics may find their place in this book. I should also point out that emphasis of this book is on it being a practical primer. It is intended to provide some practical guidance to doing GWAS, and while theory is important, I will not cover this. Again, some very useful and excellent work exists to which I will point you, but I really want you to learn - and understand the theory - by doing.

So, although originally crafted as a companion for the course, this practical guide stands on its own as a comprehensive resource for diving into all facets of doing a GWAS — save for experimental follow-up, of course 😉.

I can imagine this seems overwhelming, but trust me, you’ll be okay. Just follow this practical. You’ll learn by doing and at the end of the day, you can execute a GWAS independently.

Ready to start?

2 Some background reading

Standing on the shoulders of giants, that’s what this book and I do. I want to acknowledge some great work that has helped me tremendously and, really, this book wouldn’t exist without this awesome work. So, I do want to give you some background reading. Is it a prerequisite? No, not really. For starters, the course covers most and you’ll learn as you go. And if you didn’t come here through the course, you’ll be fine just the same. That said, it’s a always good idea to get familiar with these works as you move forward on your path towards your first GWAS - in fact, I had these printed out with markings and writings all over them as I executed my first GWAS, and they’ve been great as a reference many times after.

Large parts of this work are based on four awesome Nature Protocols from the Zondervan group at the Wellcome Center Human Genetics.

  1. Zondervan KT et al. Designing candidate gene and genome-wide case-control association studies. Nat Protoc 2007.
  2. Pettersson FH et al. Marker selection for genetic case-control association studies. Nat Protoc 2009.
  3. Anderson CA et al. Data QC in genetic case-control association studies. Nat Protoc 2010.
  4. Clarke GM et al. Basic statistical analysis in genetic case-control studies. Nat Protoc 2011.

An update on the community standards of QC for GWAS can be found here:

  1. Laurie CC et al. Quality control and quality assurance in genotypic data for genome-wide association studies. Genet Epidemiol 2010.

With respect to imputation and meta-analyses of GWAS you should also get familiar with the following two works:

  1. Marchini, J. and Howie, B. Genotype imputation for genome-wide association studies. Nat Rev Genet 2010
  2. de Bakker PIW et al. Practical aspects of imputation-driven meta-analysis of genome-wide association studies. Hum Mol Genet 2008.
  3. Winkler TW et al. Quality control and conduct of genome-wide association meta-analyses. Nat Protoc 2014.

Are you ready?

Are you ready? Did you bring coffee and a good dose of energy? Let’s start! Your first point of action is to prepare your system for this course in Chapter 3.

3 Getting started

Before getting started, we need to discuss computers, specifically your computer. Most programs made to execute genetic epidemiology studies are developed for the Unix environment, for example Linux and macOS. So, they may not work as intended in a Windows environment. Windows does allow users to install a linux subsystem within Windows 10+ and you can find the detail guide here.

However, I highly recommend one of two options.

  • One, install a linux subsystem on your Windows computer (for example a virtual machine with Ubuntu could work).
  • Two, switch to macOS in combination with homebrew. This will give you all the flexibility to use Unix-based programs for your genetic epidemiology work and at the same time you’ll keep the advantage of a powerful computer with a user-friendly interface.

I chose the latter.

For this practical every command is intended for Linux/macOS, in other words Unix-systems.

3.1 CoCalc vs. Standalone

For the purpose of this practical primer there are one of two steps you can to take to get started.

  • When you are following the course, you were invited to the CoCalc server of this course. So, you will want to read the section CoCalc.
  • When you want to use this book as a standalone, you should check out the instructions in section Standalone - this is probably also the section you want to follow for real-world cases.

But first, I’ll briefly provide some background on the various programs that are commonly used Chapter 4.

4 Getting started - programs

We’ll use a few programs throughout this practical. You’ll probably need these for your (future) genetic epidemiology work too (Table 4.1).

Table 4.1: Programs needed for genetic epidemiology.

Program

Link

Description

PLINK

https://www.cog-genomics.org/plink2/

PLINK is a free, open-source genetic analysis tool set, designed to perform a range of basic data parsing and quality control, as well as basic and large-scale analyses in a computationally efficient manner.

R

https://cran.r-project.org/

A program to perform statistical analysis and visualizations.

RStudio

https://www.rstudio.com

A user-friendly R-wrap-around for code editing, debugging, analyses, and visualization.

Homebrew

https://brew.sh

A great extension for Mac-users to install really useful programs that Apple didn't.

4.1 RStudio

RStudio is a very user-friendly interface around R that makes your R-scripting-life a lot easier. You should get used to that. RStudio comes with R so you don’t have to worry about that.

4.3 Other programs

Mendelian randomization can be done either with the SMR or GSMR function from GCTA, or with R-packages, like TwoSampleMR.

4.4 Did you choose?

Now is the moment of decision. You should opt for the CoCalc-instructions when you following the course. In all other cases, your best bet are the Standalone-instructions.

Go to Chapter 5 for the Standalone-instructions.

Go to Chapter 6 for the CoCalc-instructions.

5 Getting started - Standalone

So, you plan to use this book as ‘Standalone’ on a macOS environment. This means you’ll need to install a few things first.

5.1 The data you need

You’ll need to start by downloading the data you need for this practical to your Desktop.

Here’s the link to the data.

Link to Google Drive with data

Make sure you put the data in the ~/Desktop/practical/ folder.

The data are pretty large (approx. 15Gb), so this will take a minute or two depending on your internet connection. Time to stretch your legs or grab a coffee (data scientists don’t drink tea).

Note: the WTCCC1 data are not available for public download, as you need permission to use them. However, we do provide the instructions under the assumption your WTCCC1 data will be on genome build 37 and imputed against 1000G phase 3.

5.2 Terminal

For all the programs we use, except RStudio, you will need the Terminal. This comes with every major operating system; on Windows it is called ‘PowerShell’, but let’s not go there. And regardless, you will (have to start to) make your own scripts. The benefit of using scripts is that each step in your workflow is clearly stipulated and annotated, and it allows for greater reproducibility, easier troubleshooting, and scaling up to high-performance computer clusters.

Open the Terminal, it should be on the left in the toolbar as a little black computer-monitor-like icon. Mac users can type command + space and type terminal, a Terminal screen should open.

From now on we will use little code blocks like the example to indicate a code you should type/copy-paste and hit enter. If a code is followed by a comment, it is indicated by a # - you don’t need to copy-paste and execute this.

CODE BLOCK

CODE BLOCK # some comment here

5.4 Installing the software

5.4.1 brew

Linux has a great package-manager that is lacking on macOS. You can install brew to compensate for this. This adds the ability to install almost any Linux-based program through the Terminal such as wget, llvm, etc.

Open Terminal and execute the following:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Check if everything is in order.

brew doctor

It shouldn’t report any errors.

5.4.3 Installing R and RStudio

Let’s go ahead and use brew to install the R and RStudio software.

In Terminal execute the following and just follow the instructions.

brew install rstudio
brew install --cask r

Now close the terminal window - really make sure that the terminal-program has quit.

Open your fresh installation of RStudio by double clicking the icon. You should be seeing something like figure 5.2

RStudio screenshot.

Figure 5.2: RStudio screenshot.

In the top right, you see a little green-white plus-sign, click this and select ‘R Notebook’ (Figure 5.3).

RStudio screenshot.

Figure 5.3: RStudio screenshot.

You will create an untitled (Untitled1) R notebook: you can combine text descriptions, like you would in a lab-journal, with code-sections. Read what is in the notebook to get a grasp on that (Figure 5.4).

RStudio screenshot.

Figure 5.4: RStudio screenshot.

Right, you should be installing some packages. To do so, you can remove plot(cars) (or leave and create a new code-block as per instructions in the notebook), and copy paste the code below. Make sure to put in a code block like the example in which plot(cars) is in.

remotes::install_github(c("rstudio/rmarkdown"))

install.packages(c("formatR", "remotes", 
                   "httr", "usethis", 
                   "data.table", "devtools", 
                   "dplyr", "tibble", "tidyverse", 
                   "openxlsx",
                   "ggplot2",
                   "ggsci", "ggthemes",
                   "qqman", "CMplot", "plotly", 
                   "openxlsx"))
devtools::install_github("kassambara/ggpubr")

devtools::install_github("oliviasabik/RACER")

remotes::install_github("MRCIEU/TwoSampleMR")
devtools::install_github("MRCIEU/MRInstruments")

if (!require("BiocManager", quietly = TRUE))
  install.packages("BiocManager")
BiocManager::install("geneplotter")

You should load these packages too.

library(rmarkdown)
library(formatR)

library(openxlsx)

library(data.table)

library(tibble)
library(tidyverse)
library(dplyr)
library(plotly)

library(ggplot2)
library(devtools)
library(ggpubr)
library(ggsci)
library(ggthemes)

library(qqman)
library(CMplot)
library(RACER)

library(remotes)
library(TwoSampleMR)
library(MRInstruments)

library("geneplotter")

All in all this may take some time, good moment to relax, review your notes, stretch your legs, or take a coffee.

5.5 Are you ready?

Are you ready? Did you bring coffee and a good dose of energy? Let’s start!

Oh, one more thing: you can save your notebook, the one you just created, to keep all the R codes you are applying in the next chapters and add descriptions and notes. If you save this notebook you’ll notice that a html-file is created. This file is a legible webbrowser-friendly version of your work and contains the codes and the output (code messages, tables, and figures). And the nice thing is, that you can easily share it with others over email.

Ok. ’Nough said, let’s move on to cover some basics in Chapter 7.

6 Getting started - CoCalc

Now, pay attention. If you came here through the course Genetic Epidemiology, you don’t have to do anything. All the data you need are already downloaded and everything was set up for on the server, just follow the link as provided by the course-instructors.

Here we provide a few short instructions to navigate CoCalc.

6.1 Starting the course on CoCalc

Once logged in you should see a screen similar to the one below.

CoCalc after logging in.

Figure 6.1: CoCalc after logging in.

Navigate to the Course by clicking on the blue Your UBC CoCalc 1 projects…-button and selecting the course Genetic Epidemiology you are following.

CoCalc projects.

Figure 6.2: CoCalc projects.

Once you are in the course, you will see a screen like this one below.

CoCalc student page.

Figure 6.3: CoCalc student page.

In the Course Book you’ll find the handouts you need. In the share data folder you will find the data you’ll need.

6.2 Beginning your own notebook

If you want to start your own notebook, you can do so by clicking on the New button and selecting Jupyter Notebook.

CoCalc new notebook.

(#fig:cocalc_notebook)CoCalc new notebook.

You will probably get a screen asking you to select a kernel. You can choose R.

CoCalc kernel selection.

Figure 6.4: CoCalc kernel selection.

Now you are ready to start your own notebook - like below. You can create a new ‘cell’ with format ‘code’ or ‘text’ or ‘markdown’ and start typing.

CoCalc starting your notebook.

Figure 6.5: CoCalc starting your notebook.

6.3 Are you ready?

Are you ready? Did you bring coffee and a good dose of energy? Let’s start!

Oh, one more thing: you can save your notebook, the one you just created, to keep all the R codes you are applying in the next chapters and add descriptions and notes. If you save this notebook you’ll notice that a html-file is created. This file is a legible webbrowser-friendly version of your work and contains the codes and the output (code messages, tables, and figures). And the nice thing is, that you can easily share it with others over email.

Ok. ’Nough said, let’s move on to cover some basics in Chapter 7.

7 Steps in a Genome-Wide Association Study

Now that you understand a bit of the navigation in Unix-systems, you’re ready to start this practical primer. We will make use of a dummy dataset containing cases and controls. We will explain and execute the following steps:

  1. convert raw data to a more memory-efficient format
  2. apply extensive quality control on samples and SNPs
  3. assess the ancestral background of your study population
  4. perform association testing
  5. visualize association results

7.1 Converting datasets

The format in which genotype data are returned to investigators varies among genome-wide SNP platforms and genotyping centers. Usually genotypes have been called by a genotyping center and returned in the standard PED and MAP file formats designed for PLINK.

A PED file is a white space (space or tab)-delimited file in which each line represents one individual and the first six columns are mandatory and in the following order:

  • ‘Family ID’,
  • ‘Individual ID’,
  • ‘Paternal ID’,
  • ‘Maternal ID’,
  • ‘Sex (1=male, 2=female, 0=missing)’, and
  • ‘Phenotype (1=unaffected, 2=affected, 0=missing)’.

The subsequent columns denote genotypes that can be any character (e.g., 1, 2, 3, 4 or A, C, G, T). Zero denotes a missing genotype. Each SNP must have two alleles (i.e., both alleles are either present or absent). The order of SNPs in the PED file is given in the MAP file, in which each line denotes a single marker and the four white-space–separated columns are chromosome (1–22, X, Y or 0 for unplaced), marker name (typically an rs number), genetic distance in Morgans (this can be fixed to 0) and base-pair position (bp units).

Let’s start by using PLINK to converting the datasets to a lighter, binary form (a .bed-file). This file saves data in a more memory- and time-efficient manner (in a ‘binary’-format) to facilitate the analysis of large-scale data sets (Purcell S. 2007). The marker-information is stored in the .bim-file and the family information in the .fam-file. PLINK creates a .log file (named raw-GWA-data.log) that details (among other information) the implemented commands, the number of cases and controls in the input files, any excluded data and the genotyping rate in the remaining data. This file is very useful for checking whether the software is successfully completing commands.

Make sure you are in the right directory. Do you remember how to get there?

cd ~/Desktop/practical

Next, we’ll make a project directory.

mkdir -v ~/Desktop/practical/dummy_project

Now, we’ll convert the .ped/.map files to the binary-format.

plink --file rawdata/raw-GWA-data --make-bed --out dummy_project/rawdata

Let’s review the .log-file for a bit. It should look something like this:

PLINK v1.90b7.2 64-bit (11 Dec 2023)           www.cog-genomics.org/plink/1.9/
(C) 2005-2023 Shaun Purcell, Christopher Chang   GNU General Public License v3
Logging to dummy_project/rawdata.log.
Options in effect:
  --file rawdata/raw-GWA-data
  --make-bed
  --out dummy_project/rawdata

16384 MB RAM detected; reserving 8192 MB for main workspace.
.ped scan complete (for binary autoconversion).
Performing single-pass .bed write (317503 variants, 2000 people).
--file: dummy_project/rawdata-temporary.bed +
dummy_project/rawdata-temporary.bim + dummy_project/rawdata-temporary.fam
written.
317503 variants loaded from .bim file.
2000 people (997 males, 1003 females) loaded from .fam.
2000 phenotype values loaded from .fam.
Using 1 thread (no multithreaded calculations invoked).
Before main variant filters, 2000 founders and 0 nonfounders present.
Calculating allele frequencies... done.
Warning: 11440 het. haploid genotypes present (see dummy_project/rawdata.hh );
many commands treat these as missing.
Total genotyping rate is 0.985682.
317503 variants and 2000 people pass filters and QC.
Among remaining phenotypes, 1023 are cases and 977 are controls.
--make-bed to dummy_project/rawdata.bed + dummy_project/rawdata.bim +
dummy_project/rawdata.fam ... done.

So, there are 317,503 variants included for 2,000 people, 997 males and 1,003 females. All of these individuals are ‘founders’. There are 1,023 cases and 977 controls. The genotyping rate is about 98.6% which is pretty good. Lastly, there are 11,440 heterozygous haploid genotypes present.

Question: Can you think off what the ‘11,440 heterozygous haploid genotypes present’ represent?

7.2 Quality control

We are ready for some quality control and quality assurance, heavily inspired by Anderson et al. (Anderson C. A. 2010) and Laurie et al. (Laurie C. C. 2010). In general, we should check out a couple of things regarding the data quality on two levels:

  1. samples
  2. variants

So, we will investigate the following:

  • Are the sexes based on genetic data matching the ones given by the phenotype file?
  • Identify individuals that are outliers in terms of missing data (call rate) or heterozygosity rates. This could indicate a genotyping error or sample swap.
  • Identify duplicated or related individuals.
  • Identify individuals with divergent ancestry.
  • What are the allele frequencies?
  • What is the per-SNP call rate?
  • In the case of a case-control study (which is the case here), we need to check differential missingness between cases and controls.

Question: Can you think of other scenarios in which you may want to extend the check on differential missingness beyond a check between cases and controls?

7.3 Let’s get our hands dirty

All clear? Let’s start the work. On to step 1 of the QC for GWAS: filter samples of poor quality in Chapter 8.

8 Sample QC

Let’s start with the per-sample quality control. The goal here is to identify all the samples that for some reason (mentioned in the previous section) should be excluded.

8.1 Sex

We need to identify of individuals with discordant sex information comparing phenotypic and genotypic data. Let’s calculate the mean homozygosity rate across X-chromosome markers for each individual in the study.

plink --bfile dummy_project/rawdata --check-sex --out dummy_project/rawdata

This produces a file with the following columns:

  • FID Family ID
  • IID Within-family ID
  • PEDSEX Sex code in input file
  • SNPSEX Imputed sex code (1 = male, 2 = female, 0 = unknown)
  • STATUS ‘OK’ if PEDSEX and SNPSEX match and are nonzero, ‘PROBLEM’ otherwise
  • F Inbreeding coefficient, considering only X chromosome. Not present with ‘y-only’.
  • YCOUNT Number of nonmissing genotype calls on Y chromosome. Requires ‘ycount’/‘y-only’.

We need to get a list of individuals with discordant sex data.

cat dummy_project/rawdata.sexcheck | awk '$5 =="STATUS" || $5 =="PROBLEM"'  > dummy_project/rawdata.sexprobs.txt

Let’s have a look at the results.

cat dummy_project/rawdata.sexprobs.txt
Table 8.1: Sex issues.

FID

IID

PEDSEX

SNPSEX

STATUS

F

772

772

2

0

PROBLEM

0.3084

853

853

2

0

PROBLEM

0.3666

1,920

1,920

2

0

PROBLEM

0.4066

When the homozygosity rate (F) is more than 0.2, but less than 0.8, the genotype data are inconclusive regarding the sex of an individual and these are marked in column SNPSEX with a 0, and the column STATUS “PROBLEM”.

Report the IDs of individuals with discordant sex information (Table 8.1) to those who conducted sex phenotyping. In situations in which discrepancy cannot be resolved, add the family ID (FID) and individual ID (IID) of the samples to a file named fail-sexcheck-qc.txt (one individual per line, tab delimited).

grep "PROBLEM" dummy_project/rawdata.sexcheck | awk '{ print $1, $2}'  > dummy_project/fail-sexcheck-qc.txt

8.2 Sample call rates

Let’s get an overview of the missing data per sample and per SNP.

plink --bfile dummy_project/rawdata --missing --out dummy_project/rawdata

This produces two files, rawdata/rawdata.imiss and rawdata/rawdata.lmiss. In the .imiss-file the N_MISS column denotes the number of missing SNPs, and the F_MISS column denotes the proportion of missing SNPs per individual.

The grey dashed line in Figure 8.1 indicates the mean call rate, while the red dashed line indicates the threshold we had determined above.

Per sample call rate.

Figure 8.1: Per sample call rate.

8.3 Heterozygosity rate

To properly calculate heterozygosity rate and relatedness (identity-by-descent [IBD]) we need to do four things:

  1. pre-clean the data to get a high-quality set,
  2. of independent SNPs,
  3. exclude long-range linkage disequilibrium (LD) blocks that bias with these calculations, and
  4. exclude A/T and C/G SNPs as these may be ambivalent in interpretation when frequencies between cases and controls are close (MAF ± 0.45),
  5. remove all non-autosomal SNPs.

You can find an up-to-date list of LD blocks you should exclude in these types of analyses here for the different genome builds. In this case we are using build 37. For the purpose of this book we included a file with these regions in the support-directory.

We will use the following settings:

  • remove A/T and C/G SNPs with the flag --exclude dummy_project/all.atcg.variants.txt,
  • call rate <1% with the flag --geno 0.10,
  • Hardy-Weinberg Equilibrium (HWE) p-value > 1x10-3 with the flag --hwe 1e-3,
  • and MAF>10% with the flag --maf 0.10,
  • prune the data to only select independent SNPs (with low LD r^2) of one pair each with r^2 = 0.2 with the flags --indep-pairwise 100 10 0.2 and --extract rawdata/raw-GWA-data.prune.in,
  • SNPs in long-range LD regions (for example: MHC chr 6 25.8-36Mb, chr 8 inversion 6-16Mb, chr17 40-45Mb, and a few more) with the flag --exclude range support/exclude_problematic_range.txt,
  • remove non-autosomal SNPs with the flag --autosome.

First, get a list of A/T and C/G SNPs. Remember, the list of markers for this GWAS is noted in the .bim file. We can simply grep all the lines where the two alleles either have an A/T or C/G combination.

cat dummy_project/rawdata.bim | \
awk '($5 == "A" && $6 == "T") || ($5 == "T" && $6 == "A") || ($5 == "C" && $6 == "G") || ($5 == "G" && $6 == "C")' | awk '{ print $2, $1, $4, $3, $5, $6 }' \
> dummy_project/all.atcg.variants.txt

Second, clean the data and get a list of independent SNPs.

plink --bfile dummy_project/rawdata \
--autosome \
--maf 0.10 --geno 0.10 --hwe 1e-3 \
--indep-pairwise 100 10 0.2 \
--exclude range support/exclude_problematic_range.txt \
--make-bed --out dummy_project/rawdata.clean.temp

Please note, we have create a dataset without taking into account LD structure. Hence, the message ‘Pruned 0 variants from chromosome 1, leaving 19420.’ etc. In a dataset without any LD structure this flag --indep-pairwise 100 10 0.2 doesn’t actually work. However, with real-data you can use it to prune out unwanted SNPs in high LD.

Third, exclude the pruned SNPs. Note, how we include a file to exclude high-LD for the purpose of the practical.

plink --bfile dummy_project/rawdata.clean.temp \
--extract rawdata/raw-GWA-data.prune.in \
--make-bed --out dummy_project/rawdata.clean.ultraclean.temp

Fourth, remove the A/T and C/G SNPs.

plink --bfile dummy_project/rawdata.clean.ultraclean.temp \
--exclude dummy_project/all.atcg.variants.txt \
--make-bed --out dummy_project/rawdata.clean.ultraclean

Please note, this dataset doesn’t actually include this type of SNP, hence rawdata/all.atcg.variants.txt is empty! Again, you can use this command in real-data to exclude A/T and C/G SNPs.

Lastly, remove the temporary files.

rm -fv dummy_project/*.temp*

Finally, we can calculate the heterozygosity rate.

plink --bfile dummy_project/rawdata.clean.ultraclean --het --out dummy_project/rawdata.clean.ultraclean

This creates the file dummy_project/rawdata.clean.ultraclean.het, in which the third column denotes the observed number of homozygous genotypes, O(Hom), and the fifth column denotes the number of nonmissing genotypes, N(NM), per individual. We can now calculate the observed heterozygosity rate per individual using the formula (N(NM) - O(Hom))/N(NM).

Often there is a correlation between heterozygosity rate and missing data. Thus, we should plot the observed heterozygosity rate per individual on the x-axis and the proportion of missing SNP, that is the ‘SNP call rate’, per individuals on the y-axis (Figure 8.2).

Heterozygosity as a function of SNP call rate.

Figure 8.2: Heterozygosity as a function of SNP call rate.

Examine the plot (Figure 8.2) to decide reasonable thresholds at which to exclude individuals based on elevated missing or extreme heterozygosity. We chose to exclude all individuals with a genotype failure rate >= 0.03 (vertical dashed line) and/or a heterozygosity rate ± 3 s.d. from the mean (horizontal dashed lines). Add the FID and IID of the samples failing this QC to the file named fail-imisshet-qc.txt.

How would you create this file?

If all is right, you’d have something like Table 8.2.

Table 8.2: Failed samples due to sample call rates and heterozygosity rate.

FID

IID

28

28

50

50

52

52

53

53

67

67

96

96

205

205

298

298

310

310

351

351

404

404

418

418

423

423

428

428

442

442

444

444

548

548

772

772

835

835

850

850

853

853

910

910

939

939

966

966

968

968

1,003

1,003

1,006

1,006

1,045

1,045

1,058

1,058

1,154

1,154

1,236

1,236

1,294

1,294

1,395

1,395

1,537

1,537

1,554

1,554

1,587

1,587

1,694

1,694

1,789

1,789

1,832

1,832

1,866

1,866

1,904

1,904

1,920

1,920

1,951

1,951

1,952

1,952

1,953

1,953

1,954

1,954

1,955

1,955

1,981

1,981

1,984

1,984

1,985

1,985

1,986

1,986

8.4 Relatedness

We calculate Identity-by-Descent (IBS) to identify duplicated and related samples. In Table 8.3 we show how much DNA is shared between individuals depending on their relation(Stapples J. 2014). IBS is measured by calculating pi-hat (\(\widehat{\pi}\)), which is in essence the proportion of the DNA that a pair of samples share. To calculate this, we needed this ultraclean dataset, without low-quality SNPs and without high-LD regions.

Table 8.3: Familial relations and % DNA shared.

Relatedness

%.DNA.sharing

IBD0

IBD1

IBD2

Monozygotic twins

±100%

0

1

0.00

Parents/child

±50%

0.25

0.5

0.25

Sibling

±50%

0.25

0.5

0.25

Fraternal twins

±50%

0.25

0.5

0.25

Grandparent/grandchild

±25%

0.5

0.5

0.00

Aunt/Uncle/Niece/Nephew

±25%

0.5

0.5

0.00

Half-sibling

±25%

0.5

0.5

0.00

First-cousin

±12.5%

0.75

0.25

0.00

Half first-cousin

±6.25%

0.875

0.125

0.00

First-cousin once removed

±6.25%

0.875

0.125

0.00

Second-cousin

±3.13%

0.9375

6.25E-2

0.00

Second-cousin once removed

±1.56%

0.96875

3.125E-2

0.00

Distantly related

<1.56%

varies

varies

0.00

Unrelated (includes relationships beyond the third degree)

<1.56%

1

0

0.00

PLINK calculates the inter-individual relatedness using the --genome function.

plink --bfile dummy_project/rawdata.clean.ultraclean --genome --out dummy_project/rawdata.clean.ultraclean

We can now identify all pairs of individuals with an IBD > 0.185. The code looks at the individual call rates stored in rawdata.imiss and outputs the IDs of the individual with the lowest call rate to ‘fail-IBD-QC.txt’ for subsequent removal (Table 8.4).

First, move to the dummy_project directory.

cd dummy_project

Now, execute this script - it should work just fine out-of-the-box.

perl ../scripts/run-IBD-QC.pl rawdata rawdata.clean.ultraclean

Go back one directory.

cd ..
Table 8.4: Failed IBD and callrate.

FID

IID

1,952

1,952

1,953

1,953

1,954

1,954

1,955

1,955

1,957

1,957

1,959

1,959

1,961

1,961

1,963

1,963

1,965

1,965

1,967

1,967

1,969

1,969

1,971

1,971

1,973

1,973

1,975

1,975

8.5 Ancestral background

Using a Principal Component Analysis (PCA) we can reduce the dimensions of the data, and project the “ancestral distances”. In other words, the principal component 1 (the first dimension) and principal component 2 (the second dimension) which will capture most of the variation in the data and represent how much each sample is alike the next. And when compared to a reference, you can deduce the ancestral background of each sample in your dataset. Of course this is relative: we will only know that a given sample is very much a like samples from a given population that exists today.

Nowadays we run such PCA against a large and diverse dataset containing many different populations. Old-school GWAS (pre-2009) would compare a dataset against HapMap 3, nowadays we prefer at a minimum the 1000G phase 3 populations. And in those ancient times the preferred software to run a PCA was Eigensoft which is a bit tricky to install (see Chapter 19), but nowadays PLINK provides the --pca-flag.

For the purpose of this practical primer we will run PCA using PLINK and its --pca-flag against an earlier version of 1000G, phase 1, which is slightly smaller and just as good to use.

8.5.1 1000G phase 1

We will project our data to the reference, in this example 1000G phase 1 (1000G), which includes individuals from 14 distinct global populations across 4 ‘super’-populations (Europeans [EUR], Africans [AFR], East-Asians [EAS], and Latin Americans [AMR]). In the real-world, using phase 1 may be just fine, but if you think your population evolved through extensive migration it’s probably best to use phase 3 data. In other words, the choice of reference is really depending on the dataset.

First, we will merge our data with 1000G. The alleles at each marker must be aligned to the same DNA strand to allow our data to merge correctly. Because not all SNPs are required for this analysis the A->T and C->G SNPs, which are more difficult to align, can be omitted.

8.5.1.1 Filter the 1000G data

First, we should get a list of relevant variants from our rawdata-dataset. We don’t need the other variants present in the 1000G dataset, right?

cat dummy_project/rawdata.bim | grep "rs" > dummy_project/all.variants.txt

Extract those from the 1000G phase 1 data.

plink --bfile ref_1kg_phase1_all/1kg_phase1_all --extract dummy_project/all.variants.txt --make-bed --out ref_1kg_phase1_all/1kg_phase1_raw

8.5.1.2 Filter A/T & C/G SNPs

As explained, the A/T and C/G SNPs are problematic, we want to exclude these too. So let’s get a list of A/T and C/G variants from 1000G to exclude - this may take a while.

cat ref_1kg_phase1_all/1kg_phase1_raw.bim | \
awk '($5 == "A" && $6 == "T") || ($5 == "T" && $6 == "A") || ($5 == "C" && $6 == "G") || ($5 == "G" && $6 == "C")' | awk '{ print $2, $1, $4, $3, $5, $6 }' \
> ref_1kg_phase1_all/all.1kg.atcg.variants.txt

Exclude those A/T and C/G variants in both datasets and at the same time filter to only retain high-quality data and exclude non-autosomal variants.

plink --bfile ref_1kg_phase1_all/1kg_phase1_raw --exclude ref_1kg_phase1_all/all.1kg.atcg.variants.txt -make-bed --out ref_1kg_phase1_all/1kg_phase1_raw_no_atcg

plink --bfile dummy_project/rawdata --exclude ref_1kg_phase1_all/all.1kg.atcg.variants.txt --make-bed --out dummy_project/rawdata_1kg_phase1_raw_no_atcg

8.5.1.3 Merging datasets

Try and merge the data.

plink --bfile dummy_project/rawdata_1kg_phase1_raw_no_atcg --bmerge ref_1kg_phase1_all/1kg_phase1_raw_no_atcg --make-bed --out dummy_project/rawdata.1kg_phase1

There probably is an error …

Error: 72 variants with 3+ alleles present.
* If you believe this is due to strand inconsistency, try --flip with
  dummy_project/rawdata.1kg_phase1-merge.missnp.
  (Warning: if the subsequent merge seems to work, strand errors involving SNPs
  with A/T or C/G alleles probably remain in your data.  If LD between nearby
  SNPs is high, --flip-scan should detect them.)
* If you are dealing with genuine multiallelic variants, we recommend exporting
  that subset of the data to VCF (via e.g. '--recode vcf'), merging with
  another tool/script, and then importing the result; PLINK is not yet suited
  to handling them.
See https://www.cog-genomics.org/plink/1.9/data#merge3 for more discussion.

So let’s flip some variants.

plink --bfile dummy_project/rawdata --exclude ref_1kg_phase1_all/all.1kg.atcg.variants.txt --flip dummy_project/rawdata.1kg_phase1-merge.missnp --make-bed --out dummy_project/rawdata_1kg_phase1_raw_no_atcg

Let’s try again and merge the data.

plink --bfile dummy_project/rawdata_1kg_phase1_raw_no_atcg --bmerge ref_1kg_phase1_all/1kg_phase1_raw_no_atcg --make-bed --out dummy_project/rawdata.1kg_phase1

There still is an error – there are a few multi-allelic variants present which PLINK can’t handle.

Error: 14 variants with 3+ alleles present.
* If you believe this is due to strand inconsistency, try --flip with
  dummy_project/rawdata.1kg_phase1-merge.missnp.
  (Warning: if the subsequent merge seems to work, strand errors involving SNPs
  with A/T or C/G alleles probably remain in your data.  If LD between nearby
  SNPs is high, --flip-scan should detect them.)
* If you are dealing with genuine multiallelic variants, we recommend exporting
  that subset of the data to VCF (via e.g. '--recode vcf'), merging with
  another tool/script, and then importing the result; PLINK is not yet suited
  to handling them.
See https://www.cog-genomics.org/plink/1.9/data#merge3 for more discussion.

Let’s just remove these multi-allelic variants.

plink --bfile dummy_project/rawdata_1kg_phase1_raw_no_atcg --exclude dummy_project/rawdata.1kg_phase1-merge.missnp --make-bed --out dummy_project/rawdata_1kg_phase1_raw_no_atcg_bi

After removing those pesky multi-allelic variants, we should be able to merge the data. We should take of the following:

  • extract the pruned SNP-set (remember?), --extract rawdata/raw-GWA-data.prune.i,
  • exclude non-autosomal variants, --autosome,
  • and only keeping high-quality data, --maf 0.10 --geno 0.10 --hwe 1e-3,
plink --bfile dummy_project/rawdata_1kg_phase1_raw_no_atcg_bi \
--bmerge ref_1kg_phase1_all/1kg_phase1_raw_no_atcg \
--autosome \
--maf 0.10 --geno 0.10 --hwe 1e-3 \
--extract rawdata/raw-GWA-data.prune.in \
--make-bed --out dummy_project/rawdata.1kg_phase1.clean

Before we continue it’s best to clean up a bit of the mess.

rm -fv dummy_project/rawdata_1kg_phase1_raw_no_atcg_bi* ref_1kg_phase1_all/1kg_phase1_raw_no_atcg* dummy_project/rawdata.1kg_phase1.pruned* dummy_project/rawdata_1kg_phase1_raw_no_atcg* dummy_project/rawdata.1kg_phase1-merge* dummy_project/rawdata.1kg_phase1.bed dummy_project/rawdata.1kg_phase1.bim dummy_project/rawdata.1kg_phase1.fam dummy_project/rawdata.1kg_phase1.hh dummy_project/rawdata.1kg_phase1.log ref_1kg_phase1_all/1kg_phase1_raw.*

Now we have prepared our dataset with only high-quality SNPs that have few missing data, that are high-frequent, exclude problematic genomic ranges, and merged to the 1000G phase 1 reference dataset. Your output should look something like this:

PLINK v1.90b7.2 64-bit (11 Dec 2023)           www.cog-genomics.org/plink/1.9/
(C) 2005-2023 Shaun Purcell, Christopher Chang   GNU General Public License v3
Logging to dummy_project/rawdata.1kg_phase1.clean.log.
Options in effect:
  --autosome
  --bfile dummy_project/rawdata_1kg_phase1_raw_no_atcg_bi
  --bmerge ref_1kg_phase1_all/1kg_phase1_raw_no_atcg
  --extract rawdata/raw-GWA-data.prune.in
  --geno 0.10
  --hwe 1e-3
  --maf 0.10
  --make-bed
  --out dummy_project/rawdata.1kg_phase1.clean

16384 MB RAM detected; reserving 8192 MB for main workspace.
2000 people loaded from dummy_project/rawdata_1kg_phase1_raw_no_atcg_bi.fam.
1092 people to be merged from ref_1kg_phase1_all/1kg_phase1_raw_no_atcg.fam.
Of these, 1092 are new, while 0 are present in the base dataset.
Warning: Multiple positions seen for variant 'rs3934834'.
Warning: Multiple positions seen for variant 'rs3737728'.
Warning: Multiple positions seen for variant 'rs6687776'.
Warning: Multiple chromosomes seen for variant 'rs1050301'.
Warning: Multiple chromosomes seen for variant 'rs4850'.
317476 markers loaded from dummy_project/rawdata_1kg_phase1_raw_no_atcg_bi.bim.
312239 markers to be merged from ref_1kg_phase1_all/1kg_phase1_raw_no_atcg.bim.
Of these, 14 are new, while 312225 are present in the base dataset.
312190 more multiple-position warnings: see log file.
Performing single-pass merge (3092 people, 308317 variants).
Merged fileset written to dummy_project/rawdata.1kg_phase1.clean-merge.bed +
dummy_project/rawdata.1kg_phase1.clean-merge.bim +
dummy_project/rawdata.1kg_phase1.clean-merge.fam .
308317 variants loaded from .bim file.
3092 people (1522 males, 1570 females) loaded from .fam.
3092 phenotype values loaded from .fam.
--extract: 49856 variants remaining.
Using 1 thread (no multithreaded calculations invoked).
Before main variant filters, 3078 founders and 14 nonfounders present.
Calculating allele frequencies... done.
Total genotyping rate is 0.994867.
299 variants removed due to missing genotype data (--geno).
--hwe: 13825 variants removed due to Hardy-Weinberg exact test.
2617 variants removed due to minor allele threshold(s)
(--maf/--max-maf/--mac/--max-mac).
33115 variants and 3092 people pass filters and QC.
Phenotype data is quantitative.
--make-bed to dummy_project/rawdata.1kg_phase1.clean.bed +
dummy_project/rawdata.1kg_phase1.clean.bim +
dummy_project/rawdata.1kg_phase1.clean.fam ... done.

So in total there are 3,092 individuals, 1,522 males and 1,570 females, and 3,078 founders and 14 non-founders. The total genotyping rate is 99.5% and 33,115 variants are present.

8.5.2 Principal component analysis

Great, we’ve prepared our dummy project data and merged this with 1000G phase 1. Let’s execute the PCA using --pca in PLINK.

plink --bfile dummy_project/rawdata.1kg_phase1.clean --pca --out dummy_project/rawdata.1kg_phase1.clean

8.5.3 Plotting the PCA results

If all is peachy, you just succesfully ran PCA against 1000G phase 1. Using --pca we have calculated principal components (PCs), 20 in total by default, and we can now start plotting them. Let’s create a scatter diagram of the first two principal components, including all individuals in the file rawdata.1kg_phase1.clean.eigenvec (the first and second principal components are columns 3 and 4, respectively). We need to collect some per-sample information to color the points according to sample origin.

First we collect the results from the --pca, the dummy data phenotype information, and the reference population information.

Derive PC1 and PC2 thresholds so that only individuals who match the given ancestral population are included. For populations of European descent, this will be either the CEU or TSI 1000G individuals (Figure 8.3). Here, we chose to exclude all individuals with a first principal component score less than 0.0023.

Write the FID and IID of these individuals to a file called fail-ancestry-QC.txt.

cat dummy_project/rawdata.1kg_phase1.clean.eigenvec | \
awk '$3 < 0.0023' | awk '{ print $1, $2 }' > dummy_project/fail-ancestry-QC.txt

Choosing which thresholds to apply (and thus which individuals to remove) is not a straightforward process. The key is to remove those individuals with greatly divergent ancestry, as these samples introduce the most bias to the study. Identification of more fine-scale ancestry can be conducted by using less divergent reference samples (e.g., within Europe, stratification could be identified using the CEU, TSI (Italian), GBR (British), FIN (Finnish) and IBS (Iberian) samples from the 1,000 Genomes Project (http://www.1000genomes.org/)). Robust identification of fine-scale population structure often requires the construction of many (2–10) principal components.

PCA - Your data vs. 1000g.

Figure 8.3: PCA - Your data vs. 1000g.

8.6 Removing samples

Finally! We have a list of samples of poor quality or divergent ancestry, and duplicated or related samples. We should remove these. Let’s collect all IDs from our fail-*-files into a single file.

cat dummy_project/fail-* | sort -k1 | uniq > dummy_project/fail-qc-inds.txt

This new file should now contain a list of unique individuals failing the previous QC steps which we want to remove.

plink --bfile dummy_project/rawdata --remove dummy_project/fail-qc-inds.txt --make-bed --out dummy_project/clean_inds_data

Question: How many variants and samples are left? How many cases and how many controls did you loose?

8.7 The next step

Now that you filtered samples, we should turn our attention to step 2 of the QC for GWAS: identify SNPs of poor quality in Chapter @ref(gwas_basics_snp_qc).

9 Per-SNP QC

Now that we removed samples, we can focus on low-quality variants.

9.1 SNP call rates

We start by calculating the missing genotype rate for each SNP, in other words the per-SNP call rate.

plink --bfile dummy_project/clean_inds_data --missing --out dummy_project/clean_inds_data

Let’s visualize the results to identify a threshold for extreme genotype failure rate. We chose a callrate threshold of 3%, but it’s arbitrary and depending on the dataset, the data (visualization), and the number of samples (Figure 9.1).

Per SNP call rate.

Figure 9.1: Per SNP call rate.

9.2 Differential SNP call rates

There could also be differences in genotype call rates between cases and controls. It is very important to check for this because these differences could lead to spurious associations. We can test all markers for differences in call rate between cases and controls, or based on other criteria.

plink --bfile dummy_project/clean_inds_data --test-missing --out dummy_project/clean_inds_data

Let’s collect all the SNPs with a significantly different (P < 0.00001) missing data rate between cases and controls.

cat dummy_project/clean_inds_data.missing | awk '$5 < 0.00001' | awk '{ print $2 }' > dummy_project/fail-diffmiss-qc.txt

9.3 Allele frequencies

We should also get an idea on what the allele frequencies are in our dataset. Low frequent SNPs should probably be excluded, as these are uninformative when monomorphic (allele frequency = 0), or they may lead to spurious associations.

plink --bfile dummy_project/clean_inds_data --freq --out dummy_project/clean_inds_data

Let’s also plot these data. You can view the result below, and try it yourself (Figure 9.2).

Minor allele frequency.

Figure 9.2: Minor allele frequency.

9.3.1 A note on allele coding

Oh, one more thing about alleles.

PLINK codes alleles as follows:

A1 = minor allele, the least frequent allele A2 = major allele, the most frequent allele

And when you use PLINK the flag --freq or --maf is always relative to the A1-allele, as is the odds ratio (OR) or effect size (beta).

However, SNPTEST makes use of the so-called OXFORD-format, this codes alleles as follows:

A = the ‘other’ allele B = the ‘coded’ allele

When you use SNPTEST it will report the allele frequency as CAF, in other words the coded allele frequency, and the effect size (beta) is always relative to the B-allele. This means, CAF could be the MAF, or minor allele frequency, but this is not a given.

In other words, always make sure what the allele-coding of a given program, be it PLINK, SNPTEST, GCTA, et cetera, is! I cannot stress this enough. Ask yourself: ‘what is the allele frequency referring to?’, ‘the effect size is relative to…?’.

Right, let’s continue.

9.4 Hardy-Weinberg Equilibrium

Because we are performing a case-control genome-wide association study, we probably expect some differences in Hardy-Weinberg Equilibrium (HWE), but extreme deviations are probably indicative of genotyping errors.

plink --bfile dummy_project/clean_inds_data --hardy --out dummy_project/clean_inds_data

Let’s also plot these data. You can view the result below, and type over the code to do it yourself.

Hardy-Weinberg Equilibrium p-values per stratum.

Figure 9.3: Hardy-Weinberg Equilibrium p-values per stratum.

9.5 Final SNP QC

We are ready to perform the final QC. After inspecting the graphs we will filter on a MAF < 0.01, call rate < 0.05, and HWE < 0.00001 (Figure 9.3), in addition those SNPs that failed the differential call rate test will be removed.

plink --bfile dummy_project/clean_inds_data --exclude dummy_project/fail-diffmiss-qc.txt --maf 0.01 --geno 0.05 --hwe 0.00001 --make-bed --out dummy_project/cleandata

9.6 A Milestone

Congratulations. You reached a very important milestone. Now that you filtered samples and SNPs, we can finally start the association analyses in Chapter @ref(gwas_testing).

10 Genome-Wide Association Study

Now that you have learned how to perform QC, you can easily run a GWAS and execute some downstream visualization and analyses. Let’s do this with a dummy dataset.

10.1 Exploring the data

Even though someone says that the QC was done, it is still wise and good practice to run some of the commands above to get a ‘feeling’ about the data. So let’s do this.

plink --bfile gwas/gwa --freq --out dummy_project/gwa
plink --bfile gwas/gwa --missing --out dummy_project/gwa
plink --bfile gwas/gwa --hardy --out dummy_project/gwa

Let’s visualize the results. First we should load in all the results.

Question: Load the data using R. [Hint: use and adapt the examples from the previous chapters.]

We can plot the per-stratum HWE p-values.

Question: Plot the per-stratum HWE p-values using R. [Hint: use and adapt the examples from the previous chapters.]

Per stratum HWE p-values.

Figure 10.1: Per stratum HWE p-values.

We will want to see what the distribution of allele frequencies looks like.

Question: Plot the allele frequencies using R. [Hint: use and adapt the examples from the previous chapters.]

Minor allele frequencies.

Figure 10.2: Minor allele frequencies.

We will want to identify samples that have poor call rates.

Question: Plot the per-sample call rates using R. [Hint: use and adapt the examples from the previous chapters.]

Per sample call rates.

Figure 10.3: Per sample call rates.

We also need to know what the per SNP call rates are.

Question: Plot the per-SNP call rates using R. [Hint: use and adapt the examples from the previous chapters.]

Per SNP call rates.

Figure 10.4: Per SNP call rates.

10.2 Genetic models

A simple chi-square test of association can be done.

plink --bfile gwas/gwa --model --out gwas/data

Genotypic, dominant and recessive tests will not be conducted if any one of the cells in the table of case-control by genotype counts contains less than five observations. This is because the chi-square approximation may not be reliable when cell counts are small. For SNPs with MAFs < 5%, a sample of more than 2,000 cases and controls would be required to meet this threshold and more than 50,000 would be required for SNPs with MAF < 1%.

You can change this default behaviour by adding the flag --cell, e.g., we could lower the threshold to 3.

plink --bfile gwas/gwa --model --cell 3 --out gwas/data

Let’s review the contents of the results.

It contains 1,530,510 rows, one for each SNP, and each type of test (genotypic, trend, allelic, dominant, and recessive) and the following columns:

  • chromosome [CHR],
  • the SNP identifier [SNP],
  • the minor allele [A1] (remember, PLINK always codes the A1-allele as the minor allele!),
  • the major allele [A2],
  • the test performed [TEST]:
    • GENO (genotypic association);
    • TREND (Cochran-Armitage trend);
    • ALLELIC (allelic as- sociation);
    • DOM (dominant model); and
    • REC (recessive model)],
  • the cell frequency counts for cases [AFF],
  • the cell frequency counts for controls [UNAFF],
  • the chi-square test statistic [CHISQ],
  • the degrees of freedom for the test [DF],
  • and the asymptotic P value [P] of association.

Question: Do you know which model, i.e. TEST is most commonly used and reported? And why is that, do think?

10.3 Logistic regression

We can also perform a test of association using logistic regression. In this case we might want to correct for covariates/confounding factors, for example age, sex, ancestral background, i.e. principal components, and other study specific covariates (e.g. hospital of inclusion, genotyping centre etc.). In that case each of these P values is adjusted for the effect of the covariates.

When running a regression analysis, be it linear or logistic, PLINK assumes a multiplicative model. By default, when at least one male and one female is present, sex (male = 1, female = 0) is automatically added as a covariate on X chromosome SNPs, and nowhere else. The sex flag causes it to be added everywhere, while no-x-sex excludes it.

plink --bfile gwas/gwa --logistic sex --covar gwas/gwa.covar --out gwas/data

Let’s examine the results.

## [1] 918306      9
##      CHR       SNP      BP     A1   TEST NMISS     OR     STAT      P
##    <int>    <char>   <int> <char> <char> <int>  <num>    <num>  <num>
## 1:     1 rs3934834  995669      T    ADD  3818 1.0290  0.38120 0.7031
## 2:     1 rs3934834  995669      T    AGE  3818 1.0020  1.11800 0.2635
## 3:     1 rs3934834  995669      T    SEX  3818 1.0120  0.19090 0.8486
## 4:     1 rs3737728 1011278      A    ADD  3982 1.0190  0.38670 0.6990
## 5:     1 rs3737728 1011278      A    AGE  3982 1.0020  1.09800 0.2721
## 6:     1 rs3737728 1011278      A    SEX  3982 1.0060  0.09898 0.9212
## 7:     1 rs6687776 1020428      T    ADD  3915 0.9692 -0.33330 0.7389
## 8:     1 rs6687776 1020428      T    AGE  3915 1.0020  1.04000 0.2984
## 9:     1 rs6687776 1020428      T    SEX  3915 1.0150  0.23690 0.8127

Question: How come there are more lines in this file than there are variants?

If no model option is specified, the first row for each SNP corresponds to results for a multiplicative test of association. The C >= 0 subsequent rows for each SNP correspond to separate tests of significance for each of the C covariates included in the regression model. We can remove the covariate-specific lines from the main report by adding the hide-covar flag.

The columns in the association results are:

  • the chromosome [CHR],
  • the SNP identifier [SNP],
  • the base-pair location [BP],
  • the minor allele [A1],
  • the test performed [TEST]: ADD (multiplicative model or genotypic model testing additivity),
    • GENO_2DF (genotypic model),
    • DOMDEV (genotypic model testing deviation from additivity),
    • DOM (dominant model), or
    • REC (recessive model)],
  • the number of missing individuals included [NMISS],
  • the OR relative to the A1, i.e. minor allele,
  • the coefficient z-statistic [STAT], and
  • the asymptotic P-value [P] of association.

We need to calculate the standard error and confidence interval from the z-statistic. We can modify the effect size (OR) to output the beta by adding the beta flag.

Question: Can you write down the mathematical relation between beta and OR?

10.4 Let’s get visual

Looking at numbers is important, but it won’t give you a perfect overview. We should turn to visualizing our results in Chapter 11.

11 GWAS visualisation

Data visualization is key, not only for presentation but also to inspect the results.

11.0.1 QQ plots

We should create quantile-quantile (QQ) plots to compare the observed association test statistics with their expected values under the null hypothesis of no association and so assess the number, magnitude and quality of true associations.

First, we will add the standard error, call rate, A2, and allele frequencies.

## Key: <SNP>
##           SNP   CHR        BP     A1 NMISS     OR    STAT       P     A2    MAF
##        <char> <int>     <int> <char> <int>  <num>   <num>   <num> <char>  <num>
## 1: rs10000010     4  21227772      C  3996 1.0420  0.9010 0.36760      T 0.4258
## 2: rs10000023     4  95952929      T  3957 0.9902 -0.2160 0.82900      G 0.4841
## 3: rs10000030     4 103593179      A  3991 0.9779 -0.3696 0.71170      G 0.1616
## 4:  rs1000007     2 237416793      C  4000 1.0180  0.3649 0.71520      T 0.3122
## 5: rs10000092     4  21504615      C  3963 0.9240 -1.6770 0.09354      T 0.3430
## 6: rs10000121     4 157793485      G  3919 0.9665 -0.7525 0.45170      A 0.4532
##    NCHROBS callrate
##      <int>    <num>
## 1:    7992  0.99900
## 2:    7914  0.98925
## 3:    7982  0.99775
## 4:    8000  1.00000
## 5:    7926  0.99075
## 6:    7838  0.97975
## [1] 306102     14
## # A tibble: 6 × 14
##   SNP        CHR     BP A1    A2      MAF callrate NMISS NCHROBS     BETA     SE
##   <chr>    <int>  <int> <chr> <chr> <dbl>    <dbl> <int>   <int>    <dbl>  <dbl>
## 1 rs10000…     4 2.12e7 C     T     0.426    0.999  3996    7992  0.0411  0.0457
## 2 rs10000…     4 9.60e7 T     G     0.484    0.989  3957    7914 -0.00985 0.0456
## 3 rs10000…     4 1.04e8 A     G     0.162    0.998  3991    7982 -0.0223  0.0605
## 4 rs10000…     2 2.37e8 C     T     0.312    1      4000    8000  0.0178  0.0489
## 5 rs10000…     4 2.15e7 C     T     0.343    0.991  3963    7926 -0.0790  0.0471
## 6 rs10000…     4 1.58e8 G     A     0.453    0.980  3919    7838 -0.0341  0.0453
## # ℹ 3 more variables: OR <dbl>, STAT <dbl>, P <dbl>

Let’s list the number of SNPs per chromosome. This gives a pretty good idea about the per-chromosome coverage. And it’s a sanity check: did the whole analysis run properly (we expect 22 chromosomes)?

Question: Why do the number of variants per chrosome (approximately) correlate with the chromosome number?

Question: Where are the data for chromosome X, Y and MT?

Let’s plot the QQ plot to diagnose our GWAS.

A QQ plot.

Figure 11.1: A QQ plot.

11.1 Manhattan plots

We also need to create a Manhattan plot to display the association test P-values as a function of chromosomal location and thus provide a visual summary of association test results that draw immediate attention to any regions of significance (Figure 11.2).

A manhattan plot.

Figure 11.2: A manhattan plot.

11.2 Other plots

It is also informative to plot the density per chromosome. We can use the CMplot for that which you can find here. For now we just make these graphs ‘quick-n-dirty’, you can further prettify them, but you easily loose track of time, so maybe carry on.

Question: What do the grey spots on the density plot indicate?

This would lead to the following graphs.
SNP density of the association results.

Figure 11.3: SNP density of the association results.

A QQ plot including a 95% confidence interval (blue area) and genome-wide significant hits (red).

Figure 11.4: A QQ plot including a 95% confidence interval (blue area) and genome-wide significant hits (red).

A regular manhattan plot. Colored by chromosome, suggestive hits are green, genome-wide hits are red. The bottom graph shows the per-chromosome SNP density.

Figure 11.5: A regular manhattan plot. Colored by chromosome, suggestive hits are green, genome-wide hits are red. The bottom graph shows the per-chromosome SNP density.

A circular manhattan.

Figure 11.6: A circular manhattan.

11.3 Interactive plots

You can also make an interactive version of the Manhattan - just because you can. The code below shows you how.

library(plotly)
library(dplyr)

# Prepare the dataset (as an example we use the data (gwasResults) from the `qqman`-package)
don <- gwasResults %>%

  # Compute chromosome size
  group_by(CHR) %>%
  summarise(chr_len=max(BP)) %>%

  # Calculate cumulative position of each chromosome
  mutate(tot=cumsum(chr_len)-chr_len) %>%
  select(-chr_len) %>%

  # Add this info to the initial dataset
  left_join(gwasResults, ., by=c("CHR"="CHR")) %>%

  # Add a cumulative position of each SNP
  arrange(CHR, BP) %>%
  mutate( BPcum=BP+tot) %>%

  # Add highlight and annotation information
  mutate( is_highlight=ifelse(SNP %in% snpsOfInterest, "yes", "no")) %>%

  # Filter SNP to make the plot lighter
  filter(-log10(P)>0.5)

# Prepare X axis
axisdf <- don %>% group_by(CHR) %>% summarize(center=( max(BPcum) + min(BPcum) ) / 2 )

# Prepare text description for each SNP:
don$text <- paste("SNP: ", don$SNP, "\nPosition: ", don$BP, "\nChromosome: ", don$CHR, "\nLOD score:", -log10(don$P) %>% round(2), "\nWhat else do you wanna know", sep="")

# Make the plot
p <- ggplot(don, aes(x=BPcum, y=-log10(P), text=text)) +

    # Show all points
    geom_point( aes(color=as.factor(CHR)), alpha=0.8, size=1.3) +
    scale_color_manual(values = rep(c("grey", "skyblue"), 22 )) +

    # custom X axis:
    scale_x_continuous( label = axisdf$CHR, breaks= axisdf$center ) +
    scale_y_continuous(expand = c(0, 0)) +     # remove space between plot area and x axis

    # Add highlighted points
    geom_point(data=subset(don, is_highlight=="yes"), color="orange", size=2) +

    # Custom the theme:
    theme_bw() +
    theme(
      legend.position="none",
      panel.border = element_blank(),
      panel.grid.major.x = element_blank(),
      panel.grid.minor.x = element_blank()
    )
ggplotly(p, tooltip="text")

It will produce something like this.

Again, this is an example with dummy data - you can try to do it for our GWAS, but careful with the time. You can also choose to carry on.

You will encounter the above types of visualizations in any high-quality GWAS paper, because each is so critically informative. Usually, analysts of large-scale meta-analyses of GWAS will also stratify the QQ-plots based on the imputation quality (if your GWAS was imputed), call rate, and allele frequency (although that is rarely shared in publications, not even in supplemental material).

11.4 Stop playing around

Alright. It’s time to stop playing around and do a quick recap of what you’ve learned.

  1. You learned how to convert datasets.
  2. You learned how to execute sample QC and create diagnostic graphics
  3. You learned how to do the same for SNP QC
  4. You learned how to execute an association study given a dataset, covariates, and different assumptions regarding the genetic model.
  5. You learned how to visualize results and played around with different visuals.

You should be ready for the real stuff. And if not, the next chapter will help you get ready: Chapter @ref(wtccc1_intro).

12 The Welcome Trust Case-Control Consortium

Now that you know your way around PLINK, bash and r and have done some basic quality control and association testing, you are ready for the real thing. We have prepared a real dataset: the first release of the Welcome Trust Case-Control Consortium (WTCCC) on coronary artery disease (CAD) and a control dataset used for that project.

12.1 Genotyping

The WTCCC1 data were genotyped using a chip from Affymetrix, nowadays part of ThermoFisher. As a brand Affymetrix still exists, but the chips aren’t made anymore. Unfortunately, most links to the old generation Affymetrix chips are borken, but you can still find some information about the 500K chip that was used for WTCCC1. It’s good practice to read up a bit on what chip was used, and what support materials are available.

12.2 The data

Before quality control the original data included:

  • CAD cohort, n ± 2,000
  • Healthy controls, from the UK 1958 birth control cohort, n ± 1,500 (we won’t use this)
  • Healthy controls, from the UK National Blood Service, n ± 1,500.

12.3 Assignment

Your assignment in the next chapter (Chapter 13) is to do the following:

  1. Explore the individual datasets by calculating some statistics and visualising these.
  2. Merge the datasets in the folder wtccc1.
  3. Calculate PCs using smartPCA.
  4. Perform an association test using available covariates.
  5. Visualize the results.
  6. Identify independent SNPs.
  7. Make regional association plots.

12.4 There you go

As I wrote, you are ready for the real stuff in Chapter 13.

13 WTCCC1: a GWAS on coronary artery disease (CAD)

As usual, we start by exploring the data in hand.

plink --bfile wtccc1/CADn1871_500Kb37fwd --bmerge wtccc1/UKBSn1397_500Kb37fwd --make-bed --out wtccc1/wtccc1 && \
plink --bfile wtccc1/wtccc1 --freq --out wtccc1/wtccc1 && \
plink --bfile wtccc1/wtccc1 --hardy --out wtccc1/wtccc1 && \
plink --bfile wtccc1/wtccc1 --missing --out wtccc1/wtccc1 && \
plink --bfile wtccc1/wtccc1 --test-missing --out wtccc1/wtccc1

cat wtccc1/wtccc1.missing | awk '$5 < 0.00001' | awk '{ print $2 }' > wtccc1/wtccc1-fail-diffmiss-qc.txt

Let’s investigate the HWE p-value in the whole cohort, and per stratum (cases and controls) with the code below.

This will result in Figure 13.1.

Stratified HWE p-values.

Figure 13.1: Stratified HWE p-values.

We should also inspect the allele frequencies. Note that by default PLINK (whether v0.7, v1.9, or v2.0) stores the alleles as minor (A1) and major (A2), and therefore --maf always calculates the frequency of the minor allele (A1).

This will result in Figure 13.2.

Minor allele frequencies.

Figure 13.2: Minor allele frequencies.

There could be sample with very poor overall call rate, where for many SNPs there is no data. We will want to identify these samples and exclude them.

This will result in Figure 13.3.

Per sample call rate.

Figure 13.3: Per sample call rate.

Lastly, we must inspect the per SNP call rate; we need to know if there are SNPs that have no data for many samples. We will want to identify such SNPs and exclude these.

This will result in Figure 13.4.

Per SNP call rate.

Figure 13.4: Per SNP call rate.

13.1 Quality control

Now that we have handle on the data, we can filter it.

Do you have any thoughts on that? Do you agree with the filters I set below? How would you do it differently and why?

plink --bfile wtccc1/wtccc1 --exclude wtccc1/wtccc1-fail-diffmiss-qc.txt --maf 0.01 --geno 0.05 --hwe 0.00001 --make-bed --out wtccc1/wtccc1_clean

13.2 Ancestral background

If these individuals are all from the United Kingdom, we are certain there will be admixture from other populations given UK’s history. Let’s project the WTCCC1 data on 1000G phase 1 populations.

We will face the same issue as before with our dummy dataset with respect to EIGENSOFT. So I created the data for you to skip to the Plotting PCA section immediately. Regardless, in the Preparing PCA and Running PCA sections I show you how to get there.

13.2.1 Preparing PCA

Filtering WTCCC1

For PCA we need to perform extreme clean.

plink --bfile wtccc1/wtccc1_clean --maf 0.1 --geno 0.1 --indep-pairwise 100 50 0.2 --exclude support/exclude_problematic_range.txt --make-bed --out wtccc1/wtccc1_temp

plink --bfile wtccc1/wtccc1_temp --exclude wtccc1/wtccc1_temp.prune.out --make-bed --out wtccc1/wtccc1_extrclean

rm -fv wtccc1/wtccc1_temp*

cat wtccc1/wtccc1_extrclean.bim | awk '{ print $2 }' > wtccc1/wtccc1_extrclean.variants.txt

cat wtccc1/wtccc1.bim | grep "rs" > wtccc1/all.variants.txt

Merging WTCCC1 with 1000G phase 1

Now we are ready to extract the WTCCC1 variants from the 1000G phase 1 reference

plink --bfile ref_1kg_phase1_all/1kg_phase1_all --extract wtccc1/all.variants.txt --make-bed --out ref_1kg_phase1_all/1kg_phase1_wtccc1

Extracting the A/T and C/G SNPs as well.

cat ref_1kg_phase1_all/1kg_phase1_wtccc1.bim | \
awk '($5 == "A" && $6 == "T") || ($5 == "T" && $6 == "A") || ($5 == "C" && $6 == "G") || ($5 == "G" && $6 == "C")' | awk '{ print $2, $1, $4, $3, $5, $6 }' \
> ref_1kg_phase1_all/all.1kg_wtccc1.atcg.variants.txt
plink --bfile ref_1kg_phase1_all/1kg_phase1_wtccc1 --exclude ref_1kg_phase1_all/all.1kg_wtccc1.atcg.variants.txt --make-bed --out ref_1kg_phase1_all/1kg_phase1_wtccc1_no_atcg

plink --bfile ref_1kg_phase1_all/1kg_phase1_wtccc1_no_atcg --extract wtccc1/wtccc1_extrclean.variants.txt --make-bed --out ref_1kg_phase1_all/1kg_phase1_raw_no_atcg_wtccc1

Finally we will merge the datasets.

plink --bfile wtccc1/wtccc1_extrclean --bmerge ref_1kg_phase1_all/1kg_phase1_raw_no_atcg_wtccc1 --maf 0.1 --geno 0.1 --exclude support/exclude_problematic_range.txt --make-bed --out wtccc1/wtccc1_extrclean_1kg

13.2.2 Running PCA

cp -v wtccc1/wtccc1_extrclean_1kg.bim wtccc1/wtccc1_extrclean_1kg.pedsnp
cp -v wtccc1/wtccc1_extrclean_1kg.fam wtccc1/wtccc1_extrclean_1kg.pedind

Now that the cleaning is done, we can execute the actual PCA.

perl ~/git/EIG/bin/smartpca.perl \
-i wtccc1/wtccc1_extrclean_1kg.bed \
-a wtccc1/wtccc1_extrclean_1kg.pedsnp \
-b wtccc1/wtccc1_extrclean_1kg.pedind \
-k 10 \
-o wtccc1/wtccc1_extrclean_1kg.pca \
-p wtccc1/wtccc1_extrclean_1kg.plot \
-e wtccc1/wtccc1_extrclean_1kg.eval \
-l wtccc1/wtccc1_extrclean_1kg.log \
-m 5 \
-t 10 \
-s 6.0 \
-w ref_1kg_phase1_all/1kg-pca-populations.txt

13.2.3 Plotting PCA

If all is peachy, you were able to run the PCA for the WTCCC1 data against 1000G phase 1. Using smartpca (you know, EIGENSOFT) we have calculated principal components (PCs) and we can now start plotting them. Let’s create a scatter diagram of the first two principal components, including all individuals in the file wtccc1_extrclean_1kg.pca.evec (the first and second principal components are columns 2 and 3, respectively). Use the data in column 4 to color the points according to sample origin.

Please note! You may have been able to make EIGENSOFT to work. So you may have to change “/ref_pca_wtccc1/wtccc1_extrclean_1kg.pca.evec” to “/wtccc1/wtccc1_extrclean_1kg.pca.evec” in the command below.

And we should visualize the PCA results: are these individuals really all from European (UK) ancestry?

We expect most individuals from the WTCCC to be 100% British, but a substantial group will have a different ancestral background as shown in the Figure 13.5 you just made.

PCA - WTCCC1 vs. 1000G

Figure 13.5: PCA - WTCCC1 vs. 1000G

13.2.4 Removing samples

In a similar fashion as in the example gwas and rawdata datasets, you should consider to remove the samples below the threshold based on this PCA (Figure 13.5).

Go ahead, try that.

You’re code would be something like below:

cat wtccc1/wtccc1_extrclean_1kg.pca.evec | tail -n +2 | \
awk '$3 < 0.023' | awk '{ print $1 }' | awk -F":" '{ print $1, $2 }' > wtccc1/fail-ancestry-QC.txt

Next we filter these samples and get a final fully QC’d dataset.

plink --bfile wtccc1/wtccc1_clean --exclude wtccc1/fail-ancestry-QC.txt --make-bed --out wtccc1/wtccc1_qc

13.3 Association testing

Now that we have explored the data, we are ready for some simple association testing. However, it would be great to have some PCs to correct for. We can use PLINK for that too.

plink --bfile wtccc1/wtccc1_extrclean --exclude wtccc1/fail-ancestry-QC.txt --pca --out wtccc1/wtccc1_extrclean

Let’s add those PCs to the covariates-file.

echo "IID PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8 PC9 PC10 PC11 PC12 PC13 PC14 PC15 PC16 PC17 PC18 PC19 PC20" > wtccc1/wtccc1_qc.pca

cat wtccc1/wtccc1_extrclean.eigenvec | awk '{ print $2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22}' >> wtccc1/wtccc1_qc.pca

perl scripts/mergeTables.pl --file1 wtccc1/wtccc1_qc.pca --file2 wtccc1/wtccc1.covar --index IID --format NORM > wtccc1/wtccc1_qc.covar_pca

Exciting, now we are ready to perform a GWAS on CAD in WTCCC1.

plink --bfile wtccc1/wtccc1_qc --logistic sex --covar wtccc1/wtccc1_qc.covar_pca --out wtccc1/wtccc1_qc_log_covar_pca

After you ran the association analysis, you’re ready to process the data and take a first look at the results. First, we prepare the raw output.

You could visualize these results with the code below.

This would lead to the following graphs.
SNP density of the association results.

Figure 13.6: SNP density of the association results.

A QQ plot including a 95% confidence interval (blue area) and genome-wide significant hits (red).

Figure 13.7: A QQ plot including a 95% confidence interval (blue area) and genome-wide significant hits (red).

A regular manhattan plot. Colored by chromosome, suggestive hits are green, genome-wide hits are red. The bottom graph shows the per-chromosome SNP density.

Figure 13.8: A regular manhattan plot. Colored by chromosome, suggestive hits are green, genome-wide hits are red. The bottom graph shows the per-chromosome SNP density.

A circular manhattan.

Figure 13.9: A circular manhattan.

13.4 Replication!

You reached an important milestone.

You recreated the work by the whole WTCCC1-team that took them years in just one afternoon!

Wow. Take a pause. And realize what you’ve done.

Back then there wasn’t much on analyses after a GWAS, nowadays there are many post-GWAS analyses methods. We will cover them in the next Chapter @ref(post_gwas).

14 Post-GWAS Analyses

A critical step in post-GWAS analysis is probably ‘mapping SNPs to genes’. It is critical, but it is also the most challenging. How do you even map SNPs to genes? What criteria to use? Should we take into account physical position? Or is it of interest that certain SNPs might influence downstream or upstream gene expression? And what of the fact that most loci discovered in GWAS are _inter_genic? What is the heritability of our trait? Are there any pleiotropic effects?

In the next few sections I deal with a couple of the downstream, post-GWAS analyses. We don’t have time to go practically into a few of these steps, but I do believe it is important to provide you with some pointers where to start.

14.1 Clumping

The Manhattan plot immediately draws your attention to the peaks above the genome-wide significance threshold. Clumping is the procedure in which we identify the independent hits, those top variants and the variants in linkage disequilibrium (their ‘LD buddies’) in the same genomic region (locus). The basic steps are as follows. First define a threshold above which to identify the top variant, usually this is the genome-wide significance threshold. Next, define the maximum p-value of association a variant may have with the trait of interest. Define the strength of the correlation that is allowed between the top variant and its LD buddies. And lastly define the size of region around the top variant to assess.

Clumping can easily be done in PLINK. And you can too with the dummy GWAS dataset in this additional chapter @ref(add_chapter_regional_plot). You don’t have to now, it’s just for fun.

14.2 Conditional analyses

The visualization of a GWAS is very appealing and draws attention to single peaks, and the most significant variant. And with clumping you can identify the independent signals, i.e. the top variants and their LD buddies in the locus. We implicitly assume that the top variant captures all the variation in the region by its linkage disequilibrium with an unknown causal variant, in other words it is ‘tagging’ the (un)measured potential causal variant in the region. Intuitively it is unlikely that a single causal variant is accounting for all the LD between the unknown causal variant and the measured (genotyped or imputed) variants at the locus. So, a naive focus on only the top variant ignores the fact that multiple causal variants exist and thus the variation captured by that single top variant underestimates the total variation that could be explained by that single region (locus).

Conditional analysis is a tool to identify the secondary variants associated with the trait of interest. This involves conditioning the association model (trait ~ Variant X + covariates) on the primary variant associated in that locus. A more comprehensive and general approach would be to condition on each variant in the whole genome starting with the top variants and stepwise selecting additional variants according to their conditional p-values. This strategy could potentially result in multiple top variants in the same locus. In other words, it could uncover different haplotypes that are causing the same association with the trait of interest.

This would be straightforward with super computers and full-access to individual level data. Unfortunately we often have neither.

Don’t despair, a method exists that fills this gap. With the program GCTA you can execute conditional analyses on GWAS summary statistics - the kind you just produced with the dummy data and with the WTCCC1 dataset - and a proper reference. You can read more on this in the paper.

For now, we will skip this part. I will add a whole chapter on this at some later stage.

14.3 Statistical finemapping

Statistical finemapping is closely related to conditional analysis. Where conditional analysis identifies secondary signals in a region associated to the trait of interest, statistical finemapping answers the question ‘which variants are likely causal to the trait?’. In more formal words, through statistical finemapping we identify the 95% credible set of causal variants. There are multiple methods and tools developed to get to this answer. I list a few and I encourage you to read up on these.

14.3.1 FINEMAP

This tool is very fast and versatile, and was developed by Christian Benner. It will identify the credible sets for each locus and calculates the posterior probabilities for each set. This is the more hands-on version of getting to credible sets.

14.3.2 LocusZoom

You could upload - privately or publicly - your data to my.locuszoom.org and obtain a list of causal variants with posterior probabilities. It uses a simple procedure to obtain the credible sets using these scripts. This is the more lazy version of getting a list of likely causal variants.

14.3.3 SuSIE

An laternate approach to credible set identification is through SuSIE. Through SuSIE you can identify credible sets under the assumption of multiple causal variants, whereas FINEMAP assumes a single causal variant.

For now, we will skip this part. I will add a whole chapter on this at some later stage.

14.4 FUMA: FUnctional Mapping and Annotation of GWAS

Researchers from the VUMC in Amsterdam have created an online tool that aids in mapping genes and function to GWAS: “Functional Mapping and Annotation of Genome-Wide Association Studies” a.k.a. FUMA. This online tool uses a variety of datasets and programs to prioritize genes and map these to associated loci.

We have covered some aspects of post-GWAS analyses, and a lot are covered by FUMA. Let’s try and annotate our WTCCC1 results. The assignment in this chapter 15 will be a bit more Do It Yourself.

14.5 Phenome-wide association study

A phenome-wide association study, or PheWAS, deals with assessing the association of top variants identified in GWAS with other traits. Through a PheWAS you’ll to get a notion whether on any of the top variants, the independent hits in your GWAS, have pleiotropic effects. In other words, whether your independent hits have effects on other traits too. This will paint a picture as it were about the role the genetic locus you identified plays in life: is it unique to your trait or does it affect other traits as well? What does it mean when your top variant near the gene FTO associates not only to BMI, but also to type 2 diabetes and coronary artery disease? PheWAS will not answer that question, but they do help in inventory all the other traits to which your hits are associated.

Again, we’ll get a bit hands-on and more Do It Yourself in the chapter that deals with this. Let’s jump over to Chapter 16.

14.6 Colocalization

From all of the above follows another intuitive question. Suppose a signal in your trait also shows association - to some extent - with other traits. Do these two signals than significantly overlap, more so than you would think based on chance? Colocalization deals with exactly this question.

We are not going to deal with colocalization, but a nice starting point is RACER about which you can read more in chapter @ref(add_chapter_regional_plot). I will add a whole chapter on this at some later stage.

14.7 Genetic correlation

Because of the underlying biology or because of the way they are measured or calculated, traits can be highly correlated - phenotypically. That is to say, when the levels of HDL are high, LDL is probably low, and so when you draw a correlation plot from some data obtained in a general population you’ll see a nice pattern. Biology may also cause traits to be genetically correlated: the same genetic variants influence multiple traits. In other words, if a variant is associated with higher levels of LDL-cholesterol, it may alternatively be associated with lower HDL-cholesterol, etc. Genetic correlation will aid in further understanding the relations between traits biologically: if there is a strong genetic correlation, it is may be due to the same biological pathways and so the traits are ‘linked’ through the same processes (maybe counter-acting processes).

Puzzle: what other phenomenom could cause a high but spurious genetic correlation?

We are not going to deal with genetic correlation. I will add a whole chapter on this at some later stage.

14.8 Causal inference: Mendelian Randomization

In observational studies we may find a strong association between a certain risk factor or biomarker and a disease. For instance, epidemiological studies show that high circulating cystatin C is associated with risk of cardiovascular disease (CVD), independent of creatinine-based renal function measurements(Laan S. W. 2016). However, residual confounding and reverse causality remain alternative explanations for the strong correlation between cystatin C and CVD, both of which are difficult to tease apart from traditional observational (epidemiological) studies.

Mendelian Randomization (MR) harnesses the properties of the genome to enable causal inference of a biomarker. Specifically, the invariant nature of the genome and the random distribution of alleles from parents to offspring at conception mean that genetic information is not influenced by disease status (reverse causality) and should be free from confounding by traditional risk factors(Laan S. W. 2016). So, genetic variation that modulates serum concentrations of cystatin C could serve as an instrumental variable to assess the effect of lifelong elevated concentrations of cystatin C on disease risk, independent of potential confounders(Laan S. W. 2016).

Finding the causal genes for complex disease is a primary objective of many researchers, because these genes are putative therapeutic targets. In this course we intend to find out whether Type 2 Diabetes (T2D) causes coronary artery disease and ischemic stroke.

There is an easy, quick-and-dirty way and a harder way.

14.8.1 MRBase

The quick-and-dirty way uses MRBase. It is based on the TwoSampleMR package and uses the MRInstruments package to load in all the genetic instruments. The creators of MRBase have curated hundreds of GWAS and molecular QTL studies, and prepared the data for easy use on the website and in the R packages.

14.8.2 TwoSampleMR

The hard way means getting your hands dirty and using the TwoSampleMR package yourself in R. You’ll learn all the steps you need to take into account to get to the answer of this question. You’ll create the diagnostic graphs and calculate the statistics.

14.8.3 Your choice

Your choice. In both cases you’ll learn how to do execute a MR, what to look out for in the statistics and diagnostic graphs, and how interpret the results. Your choice: Chapter @ref(mr_mrbase) or Chapter @ref(mr_twosamplemr).

In a future version I will aim to include a partial replication of the Cystatin C paper(Laan S. W. 2016)

14.9 Polygenic scores

Under the assumption of polygenicity, many variants with small effects contribute to the phenotypic variation in a trait or the risk to disease. Sample size and accurate phenotyping have a major impact on the power of a GWAS. It is estimated that 70% of variants that reach 10-6 in an initial discovery GWAS will reach genome-wide significance with increasing sample sizes. The individual variants that do reach genome-wide significance the first or second time around do not explain all the phenotypic variation or residual disease risk.

To capture the polygenicity of a trait beyond individual genome-wide significant hits, we can calculate a polygenic score (PGS). There are several methods to calculate PGS, but essentially it comes down to multiplying the effect size at a given variant with the number of effect alleles a given individual carries. Depending on the method you can use the ‘hard-coded’ genotyped data, or the imputed data. In case of the latter the effect sizes are multiplied by the genotype probabilities or dosages, this ensures that the PGS takes into account the uncertainty intrinsic to imputed data.

Let’s consider the most intuitive PGS-method which is based on p-value thresholding, which was nicely applied in this classic paper. This method selects variants based on their p-value and than calculates the PGS. This can be done using increasingly liberal significance thresholds (pT), for instance starting with all variants with p < 10-8, next p < 10-7, p < 10-6, p < 10-5, p < 10-4, p < 10-3, p < 0.05, p < 0.1, p < 0.2, p < 0.3, p < 0.4, p < 0.5. Under the assumption of polygenicity we expect an increasingly stronger correlation (r2) of the PGS at a certain pT with the trait of interest. Another application of this method is provided by Van Setten(Setten J. 2015).

Lastly, there is a great explanatory website on how to calculate PGS, and it also shows one application of PGS (although much debate ensues about this particular application!).

14.10 What comes next

You come to the end of this practical primer. What is left are a summary (not written yet) of what you’ve learned and should take home. And some musings in the Epilogue (18 on this book and what the future holds.

15 Functional Mapping and Annotation of GWAS

15.1 Assignment

15.1.1 Tutorial

Go to the FUMA website, get an account, and study the online-tutorial.

15.1.2 Create the input

You will need to use the fwrite function in r to write the concatenated results of the WTCCC1 study (remember: wtccc1_assoc_compl).

Question: can you figure out the sample size of the WTCCC1 data you used?

Make sure you know what the column-names are in the file, you’ll need that for FUMA. You can use cat your_file | head to get the first 10 lines of the file.

You will need to compress the resulting output, this will make uploading to FUMA go faster. You can use the bash-program gzip for that. If you want to know what the options are for that program, you can use gzip -h.

15.1.3 Run FUMA - SNP to gene

Upload via the form on the FUMA-website. Since you’ve done the tutorial you are familiar with its options.

Select everything in the tabs Gene Mapping (positional mapping), Gene Mapping (eQTL mapping) but not GTEx v6 and GTEx v7, and Gene Mapping (3D Chromatin Interaction mapping) and leave the settings at Gene types and MHC region as-is. At MAGMA analysis set the MAGMA gene expression analysis to include all tissues, but GTEx v6 and GTEx v7.

Don’t forget to give your analysis a name.

This will take some time and so it’s a good moment to carry on with the rest of the practical or take a break, or study for the exam.

Questions

  1. How many lead SNPs did we find?
  2. What do the results of MAGMA (the gene-based test) look like and how many genes pass the threshold of multiple testing correction?
  3. How many loci were mapped?
  4. How many genes were physically located and how many were mapped to these loci?
  5. Do you think all loci are ‘correct’, i.e. do you ‘believe’ all the signals looking at the mapping results? Why?
  6. For what tissues are the signals enriched?
  7. Are there any chromatin interactions discovered?

15.1.4 Run FUMA - Gene to function

Now that you mapped SNPs to genes, it’s time to go back to ‘My Jobs’. Select your job and perform GENE2FUNC.

Questions

  1. What genes show the lowest expression across tissues?
  2. And what genes the highest?
  3. For what pathways are the signals enriched?
  4. What molecular functions are mapped to the signals?

15.2 Some closing thoughts

FUMA is a great tool, but it comes with a caveat. It includes a couple of references of which it is not readily clear which variants are included - the authors do provide the codes used on Git, but still, you don’t know which variants precisely are filtered. That is key: perhaps the top variant you discovered is filtered in the reference. This means FUMA will not use it to map SNPs to genes, rather next best variant. This should be in high-LD - but, again, assumptions… And of course, the references used might not match your data well enough. So, my advice: use FUMA (why not be lazy rather than work hard?), but aware of such caveats as I described. All in all, I do think FUMA is very complete, intuitive, and it makes your work publication-ready because it creates just the right file-formats for you too (.png, .svg, .pdf, .jpeg).

That said, time to move on to inspect other phenotypes in relation to your findings in the next Chapter 16 or to return to the previous chapter on post-GWAS analyses @ref(post_gwas).

16 Phenome-Wide Association Study

Given the large biobanks available nowadays that have also genotyped the participants and collected a vast-array of information on them, it is possible to perform a Phenome-Wide Association Study.

There are several options in (Table 16.1).

Table 16.1: PheWAS Resources.
Site Description
https://atlas.ctglab.nl 4,155 GWAS based on UK Biobank release 2
https://biobankengine.stanford.edu UK Biobank based
http://pheweb.sph.umich.edu University of Michigan EHR-based PheWAS
http://pheweb.sph.umich.edu/SAIGE-UKB/ 1,403 GWAS UK Biobank based
http://phewas.mrbase.org UK Biobank based

Assignment

  1. Perform a PheWAS with a few of the resources and your favorite SNP from this tutorial.
  2. Compare the different websites. What do you notice?
  3. How is a PheWAS informative?

16.1 What’s next?

You now know to what other traits, risk factors and diseases our trait of interest (coronary artery disease) is correlated. An obvious next question would be: is this a causal correlation? We will cover this aspect in the next Chapter @ref(mendelian_randomization) or to return to the previous chapter on post-GWAS analyses @ref(post_gwas).

17 MRBase

You took the easy way out. No shame in that. Your choice. Right, so as I wrote, MRBase is very easy to handle. It is based on the TwoSampleMR package and uses the MRInstruments package to load in all the genetic instruments. The creators of MRBase have curated hundreds of GWAS and molecular QTL studies, and prepared the data for easy use on the website and in the R packages.

Using MRBase we intend to find out whether Type 2 Diabetes (T2D) causes coronary artery disease and ischemic stroke.

17.1 The end?

You are almost at the end. Time to return to the previous chapter on post-GWAS analyses @ref(post_gwas).

18 Epilogue

What started as a simple ‘let’s write a practical on how to do a GWAS’, escalated into this GitBook. My second book. My fifth child (as far as I know). I hope you found it to be useful and learned a bit.

That said, much can be improved and so don’t hesitate to contact me.

As with any proper epilogue I should not forget a heartfelt and honest thank you to the readers and users of this work. Gratitude also goes to my dear colleagues Charlotte Onland, Jessica van Setten, and Kristel van Eijk, and former colleague Sara Pulit who asked me back in 2017 to join the course as a lecturer. It has been a pleasure to work with and learn from you, and it has been a fun (and sometimes stressful) experience to teach this course.

19 Additional: EIGENSOFT

There used to be a time that the preferred software EIGENSOFT for Principal Component Analysis (PCA) was EIGENSOFT For many, it still is. However, EIGENSOFT is a bit challenging to make it work to say the least. You need to install some programs, and this is not always straightforward.

So, here’s the deal.

I will share the how-to for a macOS environment below in [EIGENSOFT] - this should work in a Linux environment too as macOS is UNIX-based. You can choose to try and make it work on your system (be it UNIX or macOS based) at home (or in the office).

However, I recommend that you use the --pca function which is present in PLINK v1.9 and up. This means you should probably simply skip this section and jump straight to Chapter 8.

19.1 Install homebrew

You need to install brew, the missing package-manager and accompanying packages that Apple didn’t provide.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Next, check that everything is in order.

brew doctor

19.2 Install missing packages

Right, now that you’ve done that, you’re ready to install gsl and openblas.

brew install gsl
brew install openblas

You may also require llvm for EIGENSOFT to work.

brew install llvm

19.3 Installing EIGENSOFT

I am still sharing the code you’ll need - you could try this on your system.

mkdir -v $HOME/git
cd $HOME/git
git clone https://github.com/DReichLab/EIG.git
cd EIG/src
make
make install

20 Answers to the questions

Throughout the book you encountered questions related to some steps and output that you generated. Here you can review the answers for each of these questions - of course, for some different answers are possible.

[ANSWERS NEED TO BE WORKED OUT]

20.1 Chapter 3.1: GWAS Basics

Question: Can you think off what the ‘11,440 heterozygous haploid genotypes present’ represent?

Question: Can you think of other scenarios in which you may want to extend the check on differential missingness beyond a check between cases and controls? * For instance ‘genotyping platform’, or ‘hospital of inclusion’, if you think this might influence the genotyping experiment technically.

20.2 Chapter 3.4: GWAS Basics - Association testing

Question: Load the data using R. [Hint: use and adapt the examples from the previous chapters.]

library("data.table")

COURSE_loc = "~/Desktop/practical" # getwd()

gwas_HWE <- data.table::fread(paste0(COURSE_loc, "/dummy_project/gwa.hwe"))
gwas_FRQ <- data.table::fread(paste0(COURSE_loc, "/dummy_project/gwa.frq"))
gwas_IMISS <- data.table::fread(paste0(COURSE_loc, "/dummy_project/gwa.imiss"))
gwas_LMISS <- data.table::fread(paste0(COURSE_loc, "/dummy_project/gwa.lmiss"))

Question: Plot the per-stratum HWE p-values using R. [Hint: use and adapt the examples from the previous chapters.]

library("ggpubr")

gwas_HWE$logP <- -log10(gwas_HWE$P)

ggpubr::gghistogram(gwas_HWE, x = "logP",
                    add = "mean",
                    add.params = list(color = "#595A5C", linetype = "dashed", size = 1),
                    rug = TRUE,
                    # color = "#1290D9", fill = "#1290D9",
                    color = "TEST", fill = "TEST",
                    palette = "lancet",
                    facet.by = "TEST",
                    bins = 50,
                    xlab = "HWE -log10(P)") +
  ggplot2::geom_vline(xintercept = 5, linetype = "dashed",
                      color = "#E55738", size = 1)
ggplot2::ggsave(paste0(COURSE_loc, "/dummy_project/gwas-hwe.png"),
       plot = last_plot())

Question: Plot the allele frequencies using R. [Hint: use and adapt the examples from the previous chapters.]

ggpubr::gghistogram(gwas_FRQ, x = "MAF",
                    add = "mean", add.params = list(color = "#595A5C", linetype = "dashed", size = 1),
                    rug = TRUE,
                    color = "#1290D9", fill = "#1290D9",
                    xlab = "minor allele frequency") +
  ggplot2::geom_vline(xintercept = 0.05, linetype = "dashed",
                      color = "#E55738", size = 1)
ggplot2::ggsave(paste0(COURSE_loc, "/dummy_project/gwas-freq.png"),
       plot = last_plot())

Question: Plot the per-sample call rates using R. [Hint: use and adapt the examples from the previous chapters.]

gwas_IMISS$callrate <- 1 - gwas_IMISS$F_MISS

ggpubr::gghistogram(gwas_IMISS, x = "callrate",
                    add = "mean", add.params = list(color = "#595A5C", linetype = "dashed", size = 1),
                    rug = TRUE, bins = 50,
                    color = "#1290D9", fill = "#1290D9",
                    xlab = "per sample call rate") +
  ggplot2::geom_vline(xintercept = 0.95, linetype = "dashed",
                      color = "#E55738", size = 1)
ggplot2::ggsave(paste0(COURSE_loc, "/dummy_project/gwas-sample-call-rate.png"),
       plot = last_plot())

Question: Plot the per-SNP call rates using R. [Hint: use and adapt the examples from the previous chapters.]

gwas_LMISS$callrate <- 1 - gwas_LMISS$F_MISS

ggpubr::gghistogram(gwas_LMISS, x = "callrate",
                    add = "mean", add.params = list(color = "#595A5C", linetype = "dashed", size = 1),
                    rug = TRUE, bins = 50,
                    color = "#1290D9", fill = "#1290D9",
                    xlab = "per SNP call rate") +
  ggplot2::geom_vline(xintercept = 0.95, linetype = "dashed",
                      color = "#E55738", size = 1)
ggplot2::ggsave(paste0(COURSE_loc, "/dummy_project/gwas-snp-call-rate.png"),
       plot = last_plot())

Question: Do you know which model, i.e. TEST is most commonly used and reported? And why is that, do think?

Question: How come there are more lines in this file than there are variants?

Question: Can you write down the mathematical relation between beta and OR?

20.3 Chapter 3.5: GWAS visualization

Question: Why do the number of variants per chrosome (approximately) correlate with the chromosome number?

Question: Where are the data for chromosome X, Y and MT?

Question: What do the grey spots on the density plot indicate?

20.4 Chapter 5.4: FUMA

Question: can you figure out the sample size of the WTCCC1 data you used?

Questions

  1. How many lead SNPs did we find?
  2. What do the results of MAGMA (the gene-based test) look like and how many genes pass the threshold of multiple testing correction?
  3. How many loci were mapped?
  4. How many genes were physically located and how many were mapped to these loci?
  5. Do you think all loci are ‘correct’, i.e. do you ‘believe’ all the signals looking at the mapping results? Why?
  6. For what tissues are the signals enriched?
  7. Are there any chromatin interactions discovered?

Questions

  1. What genes show the lowest expression across tissues?
  2. And what genes the highest?
  3. For what pathways are the signals enriched?
  4. What molecular functions are mapped to the signals?

21 Licenses and disclaimers

21.2 Disclaimer

The content contained herein is provided only for educational and informational purposes or as required by Dutch law. The author attempted to ensure that content is accurate and obtained from reliable sources, but does not represent it to be error-free. The author may add, amend or repeal any text, procedure or regulation, and failure to timely post such changes to this book shall not be construed as a waiver of enforcement. The author does not warrant that any functions on this website or the contents and references herein will be uninterrupted, that defects will be corrected, or that this website or the contents and references will be free from viruses or other harmful components. Any links to third party information on the author’s website are provided as a courtesy and do not constitute an endorsement of those materials or the third party providing them.

21.3 Images and data used

I took the at-most care to use refer to the original works and data sources where needed. Likewise, all the images c.q. figures are either produced specifically for this book, or I took them from Unsplash to brighten up the book. If you feel I made a mistake and your work should be properly referenced, please don’t hesitate to contact me.

These are the images from Unsplash listed here in no particular order.

22 Colophon

The 2022 and 2024 editions of this book were produce in RStudio and with the bookdown package. Below a listing of installed programs and libraries, the operating system, and their specific versions.

## ─ Session info ───────────────────────────────────────────────────────────────
##  setting  value
##  version  R version 4.3.3 (2024-02-29)
##  os       macOS Sonoma 14.5
##  system   x86_64, darwin20
##  ui       X11
##  language (EN)
##  collate  en_US.UTF-8
##  ctype    en_US.UTF-8
##  tz       America/New_York
##  date     2024-04-04
##  pandoc   3.1.1 @ /Applications/RStudio.app/Contents/Resources/app/quarto/bin/tools/ (via rmarkdown)
## 
## ─ Packages ───────────────────────────────────────────────────────────────────
##  package           * version date (UTC) lib source
##  askpass             1.2.0   2023-09-03 [2] CRAN (R 4.3.0)
##  bookdown          * 0.38.1  2024-03-26 [2] Github (rstudio/bookdown@50a1c1e)
##  bslib               0.6.2   2024-03-22 [2] CRAN (R 4.3.2)
##  cachem              1.0.8   2023-05-01 [2] CRAN (R 4.3.0)
##  chromote            0.2.0   2024-02-12 [1] CRAN (R 4.3.2)
##  cli                 3.6.2   2023-12-11 [2] CRAN (R 4.3.0)
##  colorspace          2.1-0   2023-01-23 [2] CRAN (R 4.3.0)
##  crayon              1.5.2   2022-09-29 [2] CRAN (R 4.3.0)
##  crul                1.4.0   2023-05-17 [2] CRAN (R 4.3.0)
##  curl                5.2.1   2024-03-01 [2] CRAN (R 4.3.2)
##  data.table          1.15.4  2024-03-30 [1] CRAN (R 4.3.2)
##  digest              0.6.35  2024-03-11 [2] CRAN (R 4.3.2)
##  evaluate            0.23    2023-11-01 [2] CRAN (R 4.3.0)
##  fastmap             1.1.1   2023-02-24 [2] CRAN (R 4.3.0)
##  flextable         * 0.9.5   2024-03-06 [1] CRAN (R 4.3.2)
##  fontBitstreamVera   0.1.1   2017-02-01 [2] CRAN (R 4.3.0)
##  fontLiberation      0.1.0   2016-10-15 [2] CRAN (R 4.3.0)
##  fontquiver          0.2.1   2017-02-01 [2] CRAN (R 4.3.0)
##  formatR           * 1.14    2023-01-17 [2] CRAN (R 4.3.0)
##  gdtools             0.3.7   2024-03-05 [2] CRAN (R 4.3.2)
##  gfonts              0.2.0   2023-01-08 [2] CRAN (R 4.3.0)
##  glue                1.7.0   2024-01-09 [2] CRAN (R 4.3.0)
##  htmltools           0.5.8   2024-03-25 [2] CRAN (R 4.3.2)
##  httpcode            0.3.0   2020-04-10 [2] CRAN (R 4.3.0)
##  httpuv              1.6.15  2024-03-26 [2] CRAN (R 4.3.2)
##  jquerylib           0.1.4   2021-04-26 [2] CRAN (R 4.3.0)
##  jsonlite            1.8.8   2023-12-04 [2] CRAN (R 4.3.0)
##  kableExtra        * 1.4.0   2024-01-24 [1] CRAN (R 4.3.2)
##  knitr             * 1.45    2023-10-30 [1] CRAN (R 4.3.0)
##  later               1.3.2   2023-12-06 [2] CRAN (R 4.3.0)
##  lifecycle           1.0.4   2023-11-07 [2] CRAN (R 4.3.0)
##  magrittr            2.0.3   2022-03-30 [2] CRAN (R 4.3.0)
##  mime                0.12    2021-09-28 [2] CRAN (R 4.3.0)
##  munsell             0.5.1   2024-04-01 [1] CRAN (R 4.3.2)
##  officer             0.6.5   2024-02-24 [2] CRAN (R 4.3.2)
##  openssl             2.1.1   2023-09-25 [2] CRAN (R 4.3.0)
##  processx            3.8.4   2024-03-16 [2] CRAN (R 4.3.2)
##  promises            1.2.1   2023-08-10 [2] CRAN (R 4.3.0)
##  ps                  1.7.6   2024-01-18 [2] CRAN (R 4.3.0)
##  R6                  2.5.1   2021-08-19 [2] CRAN (R 4.3.0)
##  ragg                1.3.0   2024-03-13 [2] CRAN (R 4.3.2)
##  Rcpp                1.0.12  2024-01-09 [2] CRAN (R 4.3.0)
##  rlang               1.1.3   2024-01-10 [2] CRAN (R 4.3.0)
##  rmarkdown         * 2.26.1  2024-03-26 [2] Github (rstudio/rmarkdown@ee69d59)
##  rstudioapi          0.16.0  2024-03-24 [2] CRAN (R 4.3.2)
##  sass                0.4.9   2024-03-15 [2] CRAN (R 4.3.2)
##  scales              1.3.0   2023-11-28 [2] CRAN (R 4.3.0)
##  sessioninfo         1.2.2   2021-12-06 [2] CRAN (R 4.3.0)
##  shiny               1.8.1   2024-03-26 [2] CRAN (R 4.3.2)
##  stringi             1.8.3   2023-12-11 [2] CRAN (R 4.3.0)
##  stringr             1.5.1   2023-11-14 [2] CRAN (R 4.3.0)
##  svglite             2.1.3   2023-12-08 [1] CRAN (R 4.3.0)
##  systemfonts         1.0.6   2024-03-07 [2] CRAN (R 4.3.2)
##  textshaping         0.3.7   2023-10-09 [2] CRAN (R 4.3.0)
##  tinytex           * 0.50    2024-03-16 [2] CRAN (R 4.3.2)
##  uuid                1.2-0   2024-01-14 [2] CRAN (R 4.3.0)
##  viridisLite         0.4.2   2023-05-02 [2] CRAN (R 4.3.0)
##  webshot           * 0.5.5   2023-06-26 [1] CRAN (R 4.3.0)
##  webshot2          * 0.1.1   2023-08-11 [1] CRAN (R 4.3.0)
##  websocket           1.4.1   2021-08-18 [1] CRAN (R 4.3.0)
##  xfun                0.43    2024-03-25 [2] CRAN (R 4.3.2)
##  xml2                1.3.6   2023-12-04 [2] CRAN (R 4.3.0)
##  xtable              1.8-4   2019-04-21 [2] CRAN (R 4.3.0)
##  yaml                2.3.8   2023-12-11 [2] CRAN (R 4.3.0)
##  zip                 2.3.1   2024-01-27 [2] CRAN (R 4.3.2)
## 
##  [1] /Users/slaan3/Library/R/x86_64/4.3/library
##  [2] /Library/Frameworks/R.framework/Versions/4.3-x86_64/Resources/library
## 
## ──────────────────────────────────────────────────────────────────────────────

References

Anderson C. A., et al. 2010. “Data QC in Genetic Case-Control Association Studies.” https://www.ncbi.nlm.nih.gov/pubmed/21085122.
Laan S. W., et al. van der. 2016. “Cystatin c and Cardiovascular Disease, a Mendelian Randomization Study.” https://doi.org/10.1016/j.jacc.2016.05.092.
Laurie C. C., et al. 2010. “Quality Control and Quality Assurance in Genotypic Data for Genome-Wide Association Studies.” https://www.ncbi.nlm.nih.gov/pubmed/20718045.
Purcell S., et al. 2007. “PLINK, a Tool Set for Whole-Genome Association and Population-Based Linkage Analyses.” https://www.ncbi.nlm.nih.gov/pubmed/17701901.
Setten J., et al. van. 2015. “Serum Lipid Levels, Body Mass Index, and Their Role in Coronary Artery Calcification: A Polygenic Analysis.” https://doi.org/10.1161/CIRCGENETICS.114.000496.
Stapples J., et al. 2014. “PRIMUS: Rapid Reconstruction of Pedigrees from Genome-Wide Estimates of Identity by Descent.” https://doi.org/10.1016/j.ajhg.2014.10.005.
LS0tIAp0aXRsZTogIkEgUHJhY3RpY2FsIFByaW1lciBpbiBIdW1hbiBDb21wbGV4IEdlbmV0aWNzIgpzdWJ0aXRsZTogIndpdGggYSB1c2UtY2FzZSBpbiBjYXJkaW92YXNjdWxhciBkaXNlYXNlIgphdXRob3I6ICJbZHIuIFNhbmRlciBXLiB2YW4gZGVyIExhYW5dKGh0dHBzOi8vdmFuZGVybGFhbmFuZC5zY2llbmNlKSBbIVtdKC4vaW1nL19sb2dvL3R3aXR0ZXJfY2lyY2xlX2JsdWUucG5nKXt3aWR0aD0yJX1dKGh0dHBzOi8vd3d3LnR3aXR0ZXIuY29tL3N3dmFuZGVybGFhbikgWyFbXSguL2ltZy9fbG9nby9lbWFpbF9jaXJjbGVfYmx1ZS5wbmcpe3dpZHRoPTIlfV0obWFpbHRvOnMudy52YW5kZXJsYWFuQGdtYWlsLmNvbSkiCmRhdGU6ICJWZXJzaW9uIDIuMC4yICgyMDI0LTA0LTA0KSIKZGVzY3JpcHRpb246ICJUaGlzIGlzIGEgcHJhY3RpY2FsIHByaW1lciBpbiBodW1hbiBjb21wbGV4IGdlbmV0aWNzIHdpdGggYSB1c2UtY2FzZSBpbiBjYXJkaW92YXNjdWxhciBkaXNlYXNlLiBUaGUgb3V0cHV0IGZvcm1hdCBmb3IgdGhpcyBwcmltZXIgaXMgYm9va2Rvd246OmdpdGJvb2suIgpkb2N1bWVudGNsYXNzOiBib29rCmdpdGh1Yi1yZXBvOiBzd3ZhbmRlcmxhYW4vQV9QcmFjdGljYWxfUHJpbWVyX2luX0h1bWFuX0NvbXBsZXhfR2VuZXRpY3MKbGluay1jaXRhdGlvbnM6IHllcwpiaWJsaW9ncmFwaHk6Ci0gYmlibGlvZ3JhcGh5L2Jvb2suYmliCi0gYmlibGlvZ3JhcGh5L3BhY2thZ2VzLmJpYgpiaWJsaW8tc3R5bGU6IGFwYWxpa2UKc2l0ZTogYm9va2Rvd246OmJvb2tkb3duX3NpdGUKYWx3YXlzX2FsbG93X2h0bWw6IHllcwojY292ZXItaW1hZ2U6ICJpbWFnZXMvY292ZXIucG5nIgojYXBwbGUtdG91Y2gtaWNvbjogInRvdWNoLWljb24ucG5nIgojYXBwbGUtdG91Y2gtaWNvbi1zaXplOiAxMjAKI2Zhdmljb246ICJmYXZpY29uLmljbyIKLS0tCgojIEFib3V0IHRoaXMgcHJpbWVyCgpFdmVyIHNpbmNlIHRoZSBmaXJzdCBnZW5vbWUtd2lkZSBhc3NvY2lhdGlvbiBzdHVkeSAoR1dBUykgb24gW2FnZS1yZWxhdGVkIG1hY3VsYXIgZGVnZW5lcmF0aW9uXShodHRwczovL2RvaS5vcmcvMTAuMTEyNi9zY2llbmNlLjExMDk1NTcpe3RhcmdldD0iX2JsYW5rIn0sIGFuZCB0aGUgcHJvbWlzZSBvZiBwZXJzb25hbGl6ZWQgbWVkaWNpbmUgaW4gdGhlIHdha2Ugb2YgdGhlIEh1bWFuIEdlbm9tZSBQcm9qZWN0LCBsYXJnZS1zY2FsZSBnZW5ldGljIGFzc29jaWF0aW9uIHN0dWRpZXMgaG9sZCBzaWduaWZpY2FudCBzd2F5IGluIGNvbnRlbXBvcmFyeSBoZWFsdGggcmVzZWFyY2ggYW5kIFtkcml2ZSBkcnVnLWRldmVsb3BtZW50IHBpcGVsaW5lc10oaHR0cDovL2R4LmRvaS5vcmcvMTAuMTAzOC9ucmQuMjAxNy4yNjIpe3RhcmdldD0iX2JsYW5rIn0uIEluIHRoZSBwYXN0IDIgZGVjYWRlcywgcmVzZWFyY2hlcnMgZGVsdmVkIGludG8gR1dBUywgYWltaW5nIHRvIHVudmVpbCBnZW5ldGljIHZhcmlhdGlvbnMgbGlua2VkIHRvIGJvdGggaHVtYW4gdHJhaXRzLCBzdWNoIGFzIHRoZSBjb2xvciBvZiB5b3VyIGV5ZXMsIGFuZCByYXJlIGFuZCBjb21tb24gY29tcGxleCBkaXNlYXNlcy4gVGhlc2UgZmluZGluZ3Mgc2VydmUgYXMgY3J1Y2lhbCBrZXlzIHRvIHVucmF2ZWwgdGhlIGludHJpY2F0ZSBtZWNoYW5pc21zIHVuZGVybHlpbmcgZGlzZWFzZXMsIHNoZWRkaW5nIGxpZ2h0IG9uIHdoZXRoZXIgdGhlIGNvcnJlbGF0aW9ucyBpZGVudGlmaWVkIGluIG9ic2VydmF0aW9uYWwgc3R1ZGllcyBiZXR3ZWVuIHJpc2sgZmFjdG9ycyBhbmQgZGlzZWFzZXMgYXJlIHRydWx5IGNhdXNhbC4gCgpUaGVzZSBzdHVkaWVzIGhhdmUgdXNoZXJlZCBpbiBhbiBleGNpdGluZyBlcmEgd2hlcmUgbWFueSByZXNlYXJjaGVycyB0aHJpdmUgb24gZGV2ZWxvcGluZyBuZXcgbWV0aG9kcyBhbmQgYmlvaW5mb3JtYXRpYyB0b29scyB0byBwYXJzZSBldmVyLWdyb3dpbmcgbGFyZ2UgZGF0YXNldHMgY29sbGVjdGVkIGxhcmdlIHBvcHVsYXRpb24tYmFzZWQgYmlvYmFua3MuIEhvd2V2ZXIsIHRoZSBhbmFseXNlcyBvZiB0aGVzZSBkYXRhIGFyZSBjaGFsbGVuZ2luZyBhbmQgaXQgY2FuIGJlIGRhdW50aW5nIHRvIHNlZSB0aGUgZm9yZXN0IGZvciB0cmVlIGFtb25nIHRoZSBtYW55IHRvb2xzIGFuZCB0aGVpciB2YXJpb3VzIGZ1bmN0aW9ucy4gRW50ZXIgX0EgUHJhY3RpY2FsIFByaW1lciBpbiBIdW1hbiBDb21wbGV4IEdlbmV0aWNzXy4gVGhpcyBbR2l0Qm9va10oaHR0cHM6Ly9janZhbmxpc3NhLmdpdGh1Yi5pby9naXRib29rLWRlbW8vKXt0YXJnZXQ9Il9ibGFuayJ9IHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYmFjayBpbiAyMDIyIGZvciB0aGUgKipHZW5ldGljIEVwaWRlbWlvbG9neSoqIGNvdXJzZSBvcmdhbml6ZWQgYnkgdGhlIFtNYXN0ZXIgRXBpZGVtaW9sb2d5XShodHRwczovL2VwaWRlbWlvbG9neS1lZHVjYXRpb24ubmwpe3RhcmdldD0iX2JsYW5rIn0gb2YgVXRyZWNodCBVbml2ZXJzaXR5LiBUaGlzIHByYWN0aWNhbCBndWlkZSB3aWxsIHRlYWNoIHlvdSBob3cgdG8gZGVzaWduIGEgR1dBUywgcGVyZm9ybSBxdWFsaXR5IGNvbnRyb2wgKFFDKSwgZXhlY3V0ZSB0aGUgYWN0dWFsIGFuYWx5c2VzLCBhbm5vdGF0ZSB0aGUgR1dBUyByZXN1bHRzLCBhbmQgcGVyZm9ybSBmdXJ0aGVyIGRvd25zdHJlYW0gcG9zdC1HV0FTIGFuYWx5c2VzLiBUaHJvdWdob3V0IHRoZSBib29rIHlvdSdsbCB3b3JrIHdpdGggJ2R1bW15JywgdGhhdCBpcyBmYWtlLCBkYXRhLCBidXQgaW4gdGhlIGVuZCwgd2Ugd2lsbCB1c2UgcmVhbC13b3JsZCBkYXRhIGZyb20gdGhlIGZpcnN0IHJlbGVhc2Ugb2YgdGhlIFsqV2VsY29tZSBUcnVzdCBDYXNlLUNvbnRyb2wgQ29uc29ydGl1bSAoV1RDQ0MpKl0oaHR0cHM6Ly93d3cud3RjY2Mub3JnLnVrL2NjYzEvb3ZlcnZpZXcuaHRtbCl7dGFyZ2V0PSJfYmxhbmsifSBmb2N1c2luZyBvbiBjb3JvbmFyeSBhcnRlcnkgZGlzZWFzZSAoQ0FEKS4gCgpBIG1ham9yIGNvbXBvbmVudCBvZiBtb2Rlcm4tZGF5IEdXQVMgaXMgW2dlbmV0aWMgaW1wdXRhdGlvbl0oaHR0cHM6Ly93d3cubmF0dXJlLmNvbS9hcnRpY2xlcy9ucmcyNzk2KXt0YXJnZXQ9Il9ibGFuayJ9LCBidXQgZm9yIHByYWN0aWNhbCByZWFzb25zIGl0IGlzIG5vdCBwYXJ0IG9mIHRoaXMgYm9vay4gSG93ZXZlciwgSSB3aWxsIHByb3ZpZGUgc29tZSBwb2ludGVycyBhcyB0byBob3cgdG8gZ28gYWJvdXQgZG8gdGhpcyB3aXRoIG1pbmltYWwgY29kaW5nIG9yIHNjcmlwdGluZyBleHBlcmllbmNlLiBMaWtld2lzZSwgdGhlIGNvdXJzZXMgZG9lcyBub3QgY292ZXIgdGhlIGFzcGVjdHMgb2YgbWV0YS1hbmFseXNlcyBvZiBHV0FTLCBidXQgc29tZSBleGNlbGxlbnQgcmVzb3VyY2VzIGV4aXN0IHRvIHdoaWNoIEkgd2lsbCBkaXJlY3QuIEFzIHRoaXMgcHJhY3RpY2FsIHByaW1lciBldm9sdmVzLCB0aGVzZSBhbmQgb3RoZXIgdG9waWNzIG1heSBmaW5kIHRoZWlyIHBsYWNlIGluIHRoaXMgYm9vay4gCkkgc2hvdWxkIGFsc28gcG9pbnQgb3V0IHRoYXQgZW1waGFzaXMgb2YgdGhpcyBib29rIGlzIG9uIGl0IGJlaW5nIGEgX3ByYWN0aWNhbCBwcmltZXJfLiBJdCBpcyBpbnRlbmRlZCB0byBwcm92aWRlIHNvbWUgcHJhY3RpY2FsIGd1aWRhbmNlIHRvIGRvaW5nIEdXQVMsIGFuZCB3aGlsZSB0aGVvcnkgaXMgaW1wb3J0YW50LCBJIHdpbGwgbm90IGNvdmVyIHRoaXMuIEFnYWluLCBzb21lIHZlcnkgdXNlZnVsIGFuZCBleGNlbGxlbnQgd29yayBleGlzdHMgdG8gd2hpY2ggSSB3aWxsIHBvaW50IHlvdSwgYnV0IEkgcmVhbGx5IHdhbnQgeW91IHRvIGxlYXJuIC0gYW5kIHVuZGVyc3RhbmQgdGhlIHRoZW9yeSAtIGJ5IF9kb2luZ18uIAoKU28sIGFsdGhvdWdoIG9yaWdpbmFsbHkgY3JhZnRlZCBhcyBhIGNvbXBhbmlvbiBmb3IgdGhlIGNvdXJzZSwgdGhpcyBwcmFjdGljYWwgZ3VpZGUgc3RhbmRzIG9uIGl0cyBvd24gYXMgYSBjb21wcmVoZW5zaXZlIHJlc291cmNlIGZvciBkaXZpbmcgaW50byBhbGwgZmFjZXRzIG9mIGRvaW5nIGEgR1dBUyDigJQgc2F2ZSBmb3IgZXhwZXJpbWVudGFsIGZvbGxvdy11cCwgb2YgY291cnNlIPCfmIkuCgpJIGNhbiBpbWFnaW5lIHRoaXMgc2VlbXMgb3ZlcndoZWxtaW5nLCBidXQgdHJ1c3QgbWUsIHlvdSdsbCBiZSBva2F5LiBKdXN0IGZvbGxvdyB0aGlzIHByYWN0aWNhbC4gWW91J2xsIGxlYXJuIGJ5IGRvaW5nIGFuZCBhdCB0aGUgZW5kIG9mIHRoZSBkYXksIHlvdSBjYW4gZXhlY3V0ZSBhIEdXQVMgaW5kZXBlbmRlbnRseS4KCioqUmVhZHkgdG8gc3RhcnQ/KioKCjwhLS0gWW91ciBmaXJzdCBwb2ludCBvZiBhY3Rpb24gaXMgdG8gcHJlcGFyZSB5b3VyIHN5c3RlbSBmb3IgdGhpcyBjb3Vyc2UgaW4gQ2hhcHRlciBcQHJlZihzb21lYmFja2dyb3VuZHJlYWRpbmcpLiAtLT4KCjxzY3JpcHQ+CnRpdGxlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFkZXInKTsKdGl0bGUuaW5uZXJIVE1MID0gJzxpbWcgc3JjPSJpbWcvX2hlYWRlcnMvYmFubmVyX21hbl9zdGFuZGluZ19kbmEucG5nIiBhbHQ9IkEgUHJhY3RpY2FsIFByaW1lciBpbiBIdW1hbiBDb21wbGV4IEdlbmV0aWNzIj4nICsgdGl0bGUuaW5uZXJIVE1MCjwvc2NyaXB0PgoKPCEtLWNoYXB0ZXI6ZW5kOmluZGV4LlJtZC0tPgoKIyBTb21lIGJhY2tncm91bmQgcmVhZGluZyAgeyNzb21lYmFja2dyb3VuZHJlYWRpbmd9CjwhLS0gIVtdKC4vaW1nL19oZWFkZXJzL3BhcGVyc19vbl93YWxsLnBuZyl7d2lkdGg9MTAwJX0gLS0+CgoKCgoKU3RhbmRpbmcgb24gdGhlIHNob3VsZGVycyBvZiBnaWFudHMsIHRoYXQncyB3aGF0IHRoaXMgYm9vayBhbmQgSSBkby4gSSB3YW50IHRvIGFja25vd2xlZGdlIHNvbWUgZ3JlYXQgd29yayB0aGF0IGhhcyBoZWxwZWQgbWUgdHJlbWVuZG91c2x5IGFuZCwgcmVhbGx5LCB0aGlzIGJvb2sgd291bGRuJ3QgZXhpc3Qgd2l0aG91dCB0aGlzIGF3ZXNvbWUgd29yay4gU28sIEkgZG8gd2FudCB0byBnaXZlIHlvdSBzb21lIGJhY2tncm91bmQgcmVhZGluZy4gSXMgaXQgYSBwcmVyZXF1aXNpdGU/IE5vLCBub3QgcmVhbGx5LiBGb3Igc3RhcnRlcnMsIHRoZSBjb3Vyc2UgY292ZXJzIG1vc3QgYW5kIHlvdSdsbCBsZWFybiBhcyB5b3UgZ28uIEFuZCBpZiB5b3UgZGlkbid0IGNvbWUgaGVyZSB0aHJvdWdoIHRoZSBjb3Vyc2UsIHlvdSdsbCBiZSBmaW5lIGp1c3QgdGhlIHNhbWUuIFRoYXQgc2FpZCwgaXQncyBhIGFsd2F5cyBnb29kIGlkZWEgdG8gZ2V0IGZhbWlsaWFyIHdpdGggdGhlc2Ugd29ya3MgYXMgeW91IG1vdmUgZm9yd2FyZCBvbiB5b3VyIHBhdGggdG93YXJkcyB5b3VyIGZpcnN0IEdXQVMgLSBpbiBmYWN0LCBJIGhhZCB0aGVzZSBwcmludGVkIG91dCB3aXRoIG1hcmtpbmdzIGFuZCB3cml0aW5ncyBhbGwgb3ZlciB0aGVtIGFzIEkgZXhlY3V0ZWQgbXkgZmlyc3QgR1dBUywgYW5kIHRoZXkndmUgYmVlbiBncmVhdCBhcyBhIHJlZmVyZW5jZSBtYW55IHRpbWVzIGFmdGVyLiAKCkxhcmdlIHBhcnRzIG9mIHRoaXMgd29yayBhcmUgYmFzZWQgb24gZm91ciBhd2Vzb21lIE5hdHVyZSBQcm90b2NvbHMgZnJvbSB0aGUgW1pvbmRlcnZhbiBncm91cF0oaHR0cHM6Ly93d3cud2VsbC5veC5hYy51ay9yZXNlYXJjaC9yZXNlYXJjaC1ncm91cHMvem9uZGVydmFuLWdyb3VwKXt0YXJnZXQ9Il9ibGFuayJ9IGF0IHRoZSBXZWxsY29tZSBDZW50ZXIgSHVtYW4gR2VuZXRpY3MuCgoxLiBbWm9uZGVydmFuIEtUIF9ldCBhbC5fICpEZXNpZ25pbmcgY2FuZGlkYXRlIGdlbmUgYW5kIGdlbm9tZS13aWRlIGNhc2UtY29udHJvbCBhc3NvY2lhdGlvbiBzdHVkaWVzLiogTmF0IFByb3RvYyAyMDA3Ll0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9wdWJtZWQvMTc5NDc5OTEpe3RhcmdldD0iX2JsYW5rIn0KMi4gW1BldHRlcnNzb24gRkggX2V0IGFsLl8gKk1hcmtlciBzZWxlY3Rpb24gZm9yIGdlbmV0aWMgY2FzZS1jb250cm9sIGFzc29jaWF0aW9uIHN0dWRpZXMuKiBOYXQgUHJvdG9jIDIwMDkuXShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3B1Ym1lZC8xOTM5MDUzMCl7dGFyZ2V0PSJfYmxhbmsifQozLiBbQW5kZXJzb24gQ0EgX2V0IGFsLl8gKkRhdGEgUUMgaW4gZ2VuZXRpYyBjYXNlLWNvbnRyb2wgYXNzb2NpYXRpb24gc3R1ZGllcy4qIE5hdCBQcm90b2MgMjAxMC5dKGh0dHBzOi8vd3d3Lm5jYmkubmxtLm5paC5nb3YvcHVibWVkLzIxMDg1MTIyKXt0YXJnZXQ9Il9ibGFuayJ9CjQuIFtDbGFya2UgR00gX2V0IGFsLl8gKkJhc2ljIHN0YXRpc3RpY2FsIGFuYWx5c2lzIGluIGdlbmV0aWMgY2FzZS1jb250cm9sIHN0dWRpZXMuKiBOYXQgUHJvdG9jIDIwMTEuXShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3B1Ym1lZC8yMTI5MzQ1Myl7dGFyZ2V0PSJfYmxhbmsifQoKQW4gdXBkYXRlIG9uIHRoZSBjb21tdW5pdHkgc3RhbmRhcmRzIG9mIFFDIGZvciBHV0FTIGNhbiBiZSBmb3VuZCBoZXJlOgoKMS4gW0xhdXJpZSBDQyBfZXQgYWwuXyAqUXVhbGl0eSBjb250cm9sIGFuZCBxdWFsaXR5IGFzc3VyYW5jZSBpbiBnZW5vdHlwaWMgZGF0YSBmb3IgZ2Vub21lLXdpZGUgYXNzb2NpYXRpb24gc3R1ZGllcy4qIEdlbmV0IEVwaWRlbWlvbCAyMDEwLl0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9wdWJtZWQvMjA3MTgwNDUpe3RhcmdldD0iX2JsYW5rIn0KCldpdGggcmVzcGVjdCB0byBpbXB1dGF0aW9uIGFuZCBtZXRhLWFuYWx5c2VzIG9mIEdXQVMgeW91IHNob3VsZCBhbHNvIGdldCBmYW1pbGlhciB3aXRoIHRoZSBmb2xsb3dpbmcgdHdvIHdvcmtzOgoKMS4gW01hcmNoaW5pLCBKLiBhbmQgSG93aWUsIEIuICpHZW5vdHlwZSBpbXB1dGF0aW9uIGZvciBnZW5vbWUtd2lkZSBhc3NvY2lhdGlvbiBzdHVkaWVzLiogTmF0IFJldiBHZW5ldCAyMDEwXShodHRwczovL2RvaS5vcmcvMTAuMTAzOC9ucmcyNzk2KXt0YXJnZXQ9Il9ibGFuayJ9CjIuIFtkZSBCYWtrZXIgUElXIF9ldCBhbC5fICpQcmFjdGljYWwgYXNwZWN0cyBvZiBpbXB1dGF0aW9uLWRyaXZlbiBtZXRhLWFuYWx5c2lzIG9mIGdlbm9tZS13aWRlIGFzc29jaWF0aW9uIHN0dWRpZXMuKiBIdW0gTW9sIEdlbmV0IDIwMDguXShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3B1Ym1lZC8xODg1MjIwMCl7dGFyZ2V0PSJfYmxhbmsifQozLiBbV2lua2xlciBUVyBfZXQgYWwuXyAqUXVhbGl0eSBjb250cm9sIGFuZCBjb25kdWN0IG9mIGdlbm9tZS13aWRlIGFzc29jaWF0aW9uIG1ldGEtYW5hbHlzZXMuKiBOYXQgUHJvdG9jIDIwMTQuXShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L3B1Ym1lZC8yNDc2Mjc4Nil7dGFyZ2V0PSJfYmxhbmsifQoKCioqQXJlIHlvdSByZWFkeT8qKgoKQXJlIHlvdSByZWFkeT8gRGlkIHlvdSBicmluZyBjb2ZmZWUgYW5kIGEgZ29vZCBkb3NlIG9mIGVuZXJneT8gTGV0J3Mgc3RhcnQhIFlvdXIgZmlyc3QgcG9pbnQgb2YgYWN0aW9uIGlzIHRvIHByZXBhcmUgeW91ciBzeXN0ZW0gZm9yIHRoaXMgY291cnNlIGluIENoYXB0ZXIgXEByZWYoZ2V0dGluZy1zdGFydGVkKS4KCjwhLS0gYGBge2pzLCBlY2hvID0gRkFMU0V9IC0tPgo8IS0tIHRpdGxlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFkZXInKTsgLS0+CjwhLS0gdGl0bGUuaW5uZXJIVE1MID0gJzxpbWcgc3JjPSJpbWcvX2hlYWRlcnMvcGFwZXJzX29uX3dhbGwucG5nIiBhbHQ9IlNvbWUgYmFja2dyb3VuZCByZWFkaW5nIj4nICsgdGl0bGUuaW5uZXJIVE1MIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS1jaGFwdGVyOmVuZDowMl8xX3NvbWViYWNrZ3JvdW5kcmVhZGluZy5SbWQtLT4KCiMgR2V0dGluZyBzdGFydGVkIHsjZ2V0dGluZy1zdGFydGVkfQo8IS0tICFbXSguL2ltZy9faGVhZGVycy93b21lbl9iZWhpbmRfbWFjYm9vay5wbmcpe3dpZHRoPTEwMCV9IC0tPgoKCgoKCgpCZWZvcmUgZ2V0dGluZyBzdGFydGVkLCB3ZSBuZWVkIHRvIGRpc2N1c3MgY29tcHV0ZXJzLCBzcGVjaWZpY2FsbHkgeW91ciBjb21wdXRlci4gTW9zdCBwcm9ncmFtcyBtYWRlIHRvIGV4ZWN1dGUgZ2VuZXRpYyBlcGlkZW1pb2xvZ3kgc3R1ZGllcyBhcmUgZGV2ZWxvcGVkIGZvciB0aGUgVW5peCBlbnZpcm9ubWVudCwgZm9yIGV4YW1wbGUgTGludXggYW5kIG1hY09TLiBTbywgdGhleSBtYXkgbm90IHdvcmsgYXMgaW50ZW5kZWQgaW4gYSBXaW5kb3dzIGVudmlyb25tZW50LiBXaW5kb3dzIGRvZXMgYWxsb3cgdXNlcnMgdG8gaW5zdGFsbCBhIGxpbnV4IHN1YnN5c3RlbSB3aXRoaW4gV2luZG93cyAxMCsgYW5kIHlvdSBjYW4gZmluZCB0aGUgZGV0YWlsIFtndWlkZV0oaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG93cy93c2wvYWJvdXQpe3RhcmdldD0iX2JsYW5rIn0gaGVyZS4gIAoKSG93ZXZlciwgSSBoaWdobHkgcmVjb21tZW5kIG9uZSBvZiB0d28gb3B0aW9ucy4gCgotIE9uZSwgaW5zdGFsbCBhIGxpbnV4IHN1YnN5c3RlbSBvbiB5b3VyIFdpbmRvd3MgY29tcHV0ZXIgKGZvciBleGFtcGxlIFthIHZpcnR1YWwgbWFjaGluZSB3aXRoIFVidW50dSBjb3VsZCB3b3JrXShodHRwczovL2Jsb2cuc3RvcmFnZWNyYWZ0LmNvbS90aGUtZGVhZC1zaW1wbGUtZ3VpZGUtdG8taW5zdGFsbGluZy1hLWxpbnV4LXZpcnR1YWwtbWFjaGluZS1vbi13aW5kb3dzLyl7dGFyZ2V0PSJfYmxhbmsifSkuIAotIFR3bywgc3dpdGNoIHRvIG1hY09TIGluIGNvbWJpbmF0aW9uIHdpdGggW2hvbWVicmV3XShodHRwczovL2JyZXcuc2gpe3RhcmdldD0iX2JsYW5rIn0uIFRoaXMgd2lsbCBnaXZlIHlvdSBhbGwgdGhlIGZsZXhpYmlsaXR5IHRvIHVzZSBVbml4LWJhc2VkIHByb2dyYW1zIGZvciB5b3VyIGdlbmV0aWMgZXBpZGVtaW9sb2d5IHdvcmsgYW5kIGF0IHRoZSBzYW1lIHRpbWUgeW91J2xsIGtlZXAgdGhlIGFkdmFudGFnZSBvZiBhIHBvd2VyZnVsIGNvbXB1dGVyIHdpdGggYSB1c2VyLWZyaWVuZGx5IGludGVyZmFjZS4KCkkgY2hvc2UgdGhlIGxhdHRlci4gCgo+IEZvciB0aGlzIHByYWN0aWNhbCBldmVyeSBjb21tYW5kIGlzIGludGVuZGVkIGZvciBMaW51eC9tYWNPUywgaW4gb3RoZXIgd29yZHMgVW5peC1zeXN0ZW1zLgoKIyMgQ29DYWxjIHZzLiBTdGFuZGFsb25lCgpGb3IgdGhlIHB1cnBvc2Ugb2YgdGhpcyBwcmFjdGljYWwgcHJpbWVyIHRoZXJlIGFyZSBvbmUgb2YgdHdvIHN0ZXBzIHlvdSBjYW4gdG8gdGFrZSB0byBnZXQgc3RhcnRlZC4gCgotIFdoZW4geW91IGFyZSBmb2xsb3dpbmcgdGhlIGNvdXJzZSwgeW91IHdlcmUgaW52aXRlZCB0byB0aGUgW0NvQ2FsYyBzZXJ2ZXJdKGh0dHBzOi8vY29jYWxjMS5zY2llbmNlLnV1Lm5sKXt0YXJnZXQ9Il9ibGFuayJ9IG9mIHRoaXMgY291cnNlLiBTbywgeW91IHdpbGwgd2FudCB0byByZWFkIHRoZSBzZWN0aW9uICoqQ29DYWxjKiouIAotIFdoZW4geW91IHdhbnQgdG8gdXNlIHRoaXMgYm9vayBhcyBhIHN0YW5kYWxvbmUsIHlvdSBzaG91bGQgY2hlY2sgb3V0IHRoZSBpbnN0cnVjdGlvbnMgaW4gc2VjdGlvbiAqKlN0YW5kYWxvbmUqKiAtIHRoaXMgaXMgcHJvYmFibHkgYWxzbyB0aGUgc2VjdGlvbiB5b3Ugd2FudCB0byBmb2xsb3cgZm9yIHJlYWwtd29ybGQgY2FzZXMuIAoKQnV0IGZpcnN0LCBJJ2xsIGJyaWVmbHkgcHJvdmlkZSBzb21lIGJhY2tncm91bmQgb24gdGhlIHZhcmlvdXMgcHJvZ3JhbXMgdGhhdCBhcmUgY29tbW9ubHkgdXNlZCBDaGFwdGVyIFxAcmVmKGdldHRpbmctc3RhcnRlZC1wcm9ncmFtcykuCgo8IS0tIGBgYHtqcywgZWNobyA9IEZBTFNFfSAtLT4KPCEtLSB0aXRsZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhZGVyJyk7IC0tPgo8IS0tIHRpdGxlLmlubmVySFRNTCA9ICc8aW1nIHNyYz0iaW1nL19oZWFkZXJzL3dvbWVuX2JlaGluZF9tYWNib29rLnBuZyIgYWx0PSJHZXR0aW5nIHN0YXJ0ZWQiPicgKyB0aXRsZS5pbm5lckhUTUwgLS0+CjwhLS0gYGBgIC0tPgoKPCEtLWNoYXB0ZXI6ZW5kOjAyXzJfZ2V0dGluZ3N0YXJ0ZWQuUm1kLS0+CgojIEdldHRpbmcgc3RhcnRlZCAtIHByb2dyYW1zIHsjZ2V0dGluZy1zdGFydGVkLXByb2dyYW1zfQo8IS0tICFbXSguL2ltZy9faGVhZGVycy93b21lbl9iZWhpbmRfbWFjYm9vay5wbmcpe3dpZHRoPTEwMCV9IC0tPgoKCgoKCgpXZSdsbCB1c2UgYSBmZXcgcHJvZ3JhbXMgdGhyb3VnaG91dCB0aGlzIHByYWN0aWNhbC4gWW91J2xsIHByb2JhYmx5IG5lZWQgdGhlc2UgZm9yIHlvdXIgKGZ1dHVyZSkgZ2VuZXRpYyBlcGlkZW1pb2xvZ3kgd29yayB0b28gKFRhYmxlIFxAcmVmKHRhYjpwcm9ncmFtcykpLgoKCgoKCmBgYHs9aHRtbH0KPGRpdiBjbGFzcz0idGFid2lkIj48c3R5bGU+LmNsLThhNjYzOWJhe30uY2wtOGE2MDJmMzR7Zm9udC1mYW1pbHk6J0hlbHZldGljYSc7Zm9udC1zaXplOjExcHQ7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3R5bGU6bm9ybWFsO3RleHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOnJnYmEoMCwgMCwgMCwgMS4wMCk7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt9LmNsLThhNjI4YWE0e21hcmdpbjowO3RleHQtYWxpZ246bGVmdDtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7cGFkZGluZy1ib3R0b206NXB0O3BhZGRpbmctdG9wOjVwdDtwYWRkaW5nLWxlZnQ6NXB0O3BhZGRpbmctcmlnaHQ6NXB0O2xpbmUtaGVpZ2h0OiAxO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7fS5jbC04YTYyOWJmMnt3aWR0aDowLjkyNGluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAxLjVwdCBzb2xpZCByZ2JhKDEwMiwgMTAyLCAxMDIsIDEuMDApO2JvcmRlci10b3A6IDEuNXB0IHNvbGlkIHJnYmEoMTAyLCAxMDIsIDEwMiwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04YTYyOWJmM3t3aWR0aDoyLjcxNmluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAxLjVwdCBzb2xpZCByZ2JhKDEwMiwgMTAyLCAxMDIsIDEuMDApO2JvcmRlci10b3A6IDEuNXB0IHNvbGlkIHJnYmEoMTAyLCAxMDIsIDEwMiwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04YTYyOWJmY3t3aWR0aDoxNC4wMDJpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMS41cHQgc29saWQgcmdiYSgxMDIsIDEwMiwgMTAyLCAxLjAwKTtib3JkZXItdG9wOiAxLjVwdCBzb2xpZCByZ2JhKDEwMiwgMTAyLCAxMDIsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGE2MjliZmR7d2lkdGg6MC45MjRpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThhNjI5YzA2e3dpZHRoOjIuNzE2aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04YTYyOWMwN3t3aWR0aDoxNC4wMDJpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThhNjI5YzEwe3dpZHRoOjAuOTI0aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDEuNXB0IHNvbGlkIHJnYmEoMTAyLCAxMDIsIDEwMiwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGE2MjljMTF7d2lkdGg6Mi43MTZpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMS41cHQgc29saWQgcmdiYSgxMDIsIDEwMiwgMTAyLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04YTYyOWMxMnt3aWR0aDoxNC4wMDJpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMS41cHQgc29saWQgcmdiYSgxMDIsIDEwMiwgMTAyLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fTwvc3R5bGU+PHRhYmxlIGRhdGEtcXVhcnRvLWRpc2FibGUtcHJvY2Vzc2luZz0ndHJ1ZScgY2xhc3M9J2NsLThhNjYzOWJhJz4KCmBgYAoKPGNhcHRpb24gc3R5bGU9ImRpc3BsYXk6dGFibGUtY2FwdGlvbjsiPihcI3RhYjpwcm9ncmFtcyk8c3Bhbj5Qcm9ncmFtcyBuZWVkZWQgZm9yIGdlbmV0aWMgZXBpZGVtaW9sb2d5Ljwvc3Bhbj48L2NhcHRpb24+CgpgYGB7PWh0bWx9Cgo8dGhlYWQ+PHRyIHN0eWxlPSJvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmQ7Ij48dGggY2xhc3M9ImNsLThhNjI5YmYyIj48cCBjbGFzcz0iY2wtOGE2MjhhYTQiPjxzcGFuIGNsYXNzPSJjbC04YTYwMmYzNCI+UHJvZ3JhbTwvc3Bhbj48L3A+PC90aD48dGggY2xhc3M9ImNsLThhNjI5YmYzIj48cCBjbGFzcz0iY2wtOGE2MjhhYTQiPjxzcGFuIGNsYXNzPSJjbC04YTYwMmYzNCI+TGluazwvc3Bhbj48L3A+PC90aD48dGggY2xhc3M9ImNsLThhNjI5YmZjIj48cCBjbGFzcz0iY2wtOGE2MjhhYTQiPjxzcGFuIGNsYXNzPSJjbC04YTYwMmYzNCI+RGVzY3JpcHRpb248L3NwYW4+PC9wPjwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHIgc3R5bGU9Im92ZXJmbG93LXdyYXA6YnJlYWstd29yZDsiPjx0ZCBjbGFzcz0iY2wtOGE2MjliZmQiPjxwIGNsYXNzPSJjbC04YTYyOGFhNCI+PHNwYW4gY2xhc3M9ImNsLThhNjAyZjM0Ij5QTElOSzwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThhNjI5YzA2Ij48cCBjbGFzcz0iY2wtOGE2MjhhYTQiPjxzcGFuIGNsYXNzPSJjbC04YTYwMmYzNCI+aHR0cHM6Ly93d3cuY29nLWdlbm9taWNzLm9yZy9wbGluazIvPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGE2MjljMDciPjxwIGNsYXNzPSJjbC04YTYyOGFhNCI+PHNwYW4gY2xhc3M9ImNsLThhNjAyZjM0Ij5QTElOSyBpcyBhIGZyZWUsIG9wZW4tc291cmNlIGdlbmV0aWMgYW5hbHlzaXMgdG9vbCBzZXQsIGRlc2lnbmVkIHRvIHBlcmZvcm0gYSByYW5nZSBvZiBiYXNpYyBkYXRhIHBhcnNpbmcgYW5kIHF1YWxpdHkgY29udHJvbCwgYXMgd2VsbCBhcyBiYXNpYyBhbmQgbGFyZ2Utc2NhbGUgYW5hbHlzZXMgaW4gYSBjb21wdXRhdGlvbmFsbHkgZWZmaWNpZW50IG1hbm5lci48L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgc3R5bGU9Im92ZXJmbG93LXdyYXA6YnJlYWstd29yZDsiPjx0ZCBjbGFzcz0iY2wtOGE2MjliZmQiPjxwIGNsYXNzPSJjbC04YTYyOGFhNCI+PHNwYW4gY2xhc3M9ImNsLThhNjAyZjM0Ij5SPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGE2MjljMDYiPjxwIGNsYXNzPSJjbC04YTYyOGFhNCI+PHNwYW4gY2xhc3M9ImNsLThhNjAyZjM0Ij5odHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy88L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04YTYyOWMwNyI+PHAgY2xhc3M9ImNsLThhNjI4YWE0Ij48c3BhbiBjbGFzcz0iY2wtOGE2MDJmMzQiPkEgcHJvZ3JhbSB0byBwZXJmb3JtIHN0YXRpc3RpY2FsIGFuYWx5c2lzIGFuZCB2aXN1YWxpemF0aW9ucy48L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgc3R5bGU9Im92ZXJmbG93LXdyYXA6YnJlYWstd29yZDsiPjx0ZCBjbGFzcz0iY2wtOGE2MjliZmQiPjxwIGNsYXNzPSJjbC04YTYyOGFhNCI+PHNwYW4gY2xhc3M9ImNsLThhNjAyZjM0Ij5SU3R1ZGlvPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGE2MjljMDYiPjxwIGNsYXNzPSJjbC04YTYyOGFhNCI+PHNwYW4gY2xhc3M9ImNsLThhNjAyZjM0Ij5odHRwczovL3d3dy5yc3R1ZGlvLmNvbTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThhNjI5YzA3Ij48cCBjbGFzcz0iY2wtOGE2MjhhYTQiPjxzcGFuIGNsYXNzPSJjbC04YTYwMmYzNCI+QSB1c2VyLWZyaWVuZGx5IFItd3JhcC1hcm91bmQgZm9yIGNvZGUgZWRpdGluZywgZGVidWdnaW5nLCBhbmFseXNlcywgYW5kIHZpc3VhbGl6YXRpb24uPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIHN0eWxlPSJvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmQ7Ij48dGQgY2xhc3M9ImNsLThhNjI5YzEwIj48cCBjbGFzcz0iY2wtOGE2MjhhYTQiPjxzcGFuIGNsYXNzPSJjbC04YTYwMmYzNCI+SG9tZWJyZXc8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04YTYyOWMxMSI+PHAgY2xhc3M9ImNsLThhNjI4YWE0Ij48c3BhbiBjbGFzcz0iY2wtOGE2MDJmMzQiPmh0dHBzOi8vYnJldy5zaDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThhNjI5YzEyIj48cCBjbGFzcz0iY2wtOGE2MjhhYTQiPjxzcGFuIGNsYXNzPSJjbC04YTYwMmYzNCI+QSBncmVhdCBleHRlbnNpb24gZm9yIE1hYy11c2VycyB0byBpbnN0YWxsIHJlYWxseSB1c2VmdWwgcHJvZ3JhbXMgdGhhdCBBcHBsZSBkaWRuJ3QuPC9zcGFuPjwvcD48L3RkPjwvdHI+PC90Ym9keT48L3RhYmxlPjwvZGl2PgpgYGAKCiMjIFJTdHVkaW8KKipSU3R1ZGlvKiogaXMgYSB2ZXJ5IHVzZXItZnJpZW5kbHkgaW50ZXJmYWNlIGFyb3VuZCBgUmAgdGhhdCBtYWtlcyB5b3VyIGBSYC1zY3JpcHRpbmctbGlmZSBhIGxvdCBlYXNpZXIuIFlvdSBzaG91bGQgZ2V0IHVzZWQgdG8gdGhhdC4gKipSU3R1ZGlvKiogY29tZXMgd2l0aCBgUmAgc28geW91IGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhhdC4KCiMjIFBMSU5LClJpZ2h0LCBvbnRvIGBQTElOS2AuIAoKQWxsIGdlbmV0aWMgYW5hbHlzZXMgY2FuIGJlIGRvbmUgaW4gUExJTkssIGV2ZW4gb24geW91ciBsYXB0b3AsIGJ1dCB3aXRoIGxhcmdlIGRhdGFzZXRzLCBmb3IgZXhhbXBsZSBbVUsgQmlvYmFua10oaHR0cHM6Ly93d3cudWtiaW9iYW5rLmFjLnVrKXt0YXJnZXQ9Il9ibGFuayJ9IHNpemUsIGl0IGlzIGJldHRlciB0byBzd2l0Y2ggdG8gYSBbaGlnaC1wZXJmb3JtYW5jZSBjb21wdXRpbmcgY2x1c3RlciAoSFBDKV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGlnaC1wZXJmb3JtYW5jZV9jb21wdXRpbmcpe3RhcmdldD0iX2JsYW5rIn0gbGlrZSB3ZSBoYXZlIGF2YWlsYWJsZSBhdCB0aGUgW1V0cmVjaHQgU2NpZW5jZSBQYXJrXShodHRwczovL3dpa2kuYmlvaW5mb3JtYXRpY3MudW1jdXRyZWNodC5ubC9iaW4vdmlldy9IUEMvV2ViSG9tZSl7dGFyZ2V0PSJfYmxhbmsifS4gVGhlIG9yaWdpbmFsIFBMSU5LIHYxLjA3IGNhbiBiZSBmb3VuZCBbaGVyZV0oaHR0cHM6Ly96enouYndoLmhhcnZhcmQuZWR1L3BsaW5rL2luZGV4LnNodG1sKXt0YXJnZXQ9Il9ibGFuayJ9LCBidXQgbm93YWRheXMgd2UgYXJlIHVzaW5nIGEgbmV3ZXIsIGZhc3RlciB2ZXJzaW9uOiAqKlBMSU5LIHYxLjkqKiB3aGljaCBjYW4gYmUgZm91bmQgW2hlcmVdKGh0dHBzOi8vd3d3LmNvZy1nZW5vbWljcy5vcmcvcGxpbmsyKXt0YXJnZXQ9Il9ibGFuayJ9LiBJdCBzdGlsbCBzYXlzICdQTElOSyAxLjkwIGJldGEnIChGaWd1cmUgXEByZWYoZmlnOnBsaW5rcHJvZ3JhbSkpLCBidXQgeW91IGNhbiBjb25zaWRlciB0aGlzIHZlcnNpb24gc3RhYmxlIGFuZCBzYXZlIHRvIHdvcmsgd2l0aCwgYnV0IGFzIHlvdSBjYW4gc2VlLCBzb21lIGZ1bmN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBhbnltb3JlLgoKPGRpdiBjbGFzcz0iZmlndXJlIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj4KPGltZyBzcmM9ImltZy9wbGluay5wbmciIGFsdD0iVGhlIFBMSU5LIHYxLjkgd2Vic2l0ZS4iIHdpZHRoPSI4NSUiIC8+CjxwIGNsYXNzPSJjYXB0aW9uIj4oXCNmaWc6cGxpbmtwcm9ncmFtKVRoZSBQTElOSyB2MS45IHdlYnNpdGUuPC9wPgo8L2Rpdj4KCiMjIyBBbHRlcm5hdGl2ZXMgdG8gYFBMSU5LYApOb3dhZGF5cywgYSBsb3Qgb2YgcGVvcGxlIGFsc28gdXNlIHByb2dyYW1zIGxpa2UgW1NOUFRFU1RdKHNucHRlc3Qpe3RhcmdldD0iX2JsYW5rIn0sIFtCT0xULUxNTV0oaHR0cHM6Ly9kYXRhLmJyb2FkaW5zdGl0dXRlLm9yZy9hbGtlc2dyb3VwL0JPTFQtTE1NLyl7dGFyZ2V0PSJfYmxhbmsifSwgIFtHQ1RBXShodHRwOi8vY25zZ2Vub21pY3MuY29tL3NvZnR3YXJlL2djdGEvI092ZXJ2aWV3KXt0YXJnZXQ9Il9ibGFuayJ9LCBvciBbcmVnZW5pZV0oaHR0cHM6Ly9yZ2NnaXRodWIuZ2l0aHViLmlvL3JlZ2VuaWUvKXt0YXJnZXQ9Il9ibGFuayJ9IGFzIGFsdGVybmF0aXZlcyB0byBleGVjdXRlIEdXQVMuIFRoZXNlIHByb2dyYW1zIHdlcmUgZGVzaWduZWQgd2l0aCBzcGVjaWZpYyB1c2UtY2FzZXMgaW4gbWluZCwgZm9yIGluc3RhbmNlIHJlYWxseSBsYXJnZSBiaW9iYW5rIGRhdGEgaW5jbHVkaW5nIGh1bmRyZWRzIG9mIHRob3VzYW5kcyBpbmRpdmlkdWFscywgYmV0dGVyIGNvbnRyb2wgZm9yIHBvcHVsYXRpb24gc3RyYXRpZmljYXRpb24sIHRoZSBhYmlsaXR5IHRvIGVzdGltYXRlIHRyYWl0IGhlcml0YWJpbGl0eSBvciBGc3QsIGFuZCBzbyBvbi4KCiMjIE90aGVyIHByb2dyYW1zCk1lbmRlbGlhbiByYW5kb21pemF0aW9uIGNhbiBiZSBkb25lIGVpdGhlciB3aXRoIHRoZSBbU01SXShodHRwOi8vY25zZ2Vub21pY3MuY29tL3NvZnR3YXJlL3Ntci8jT3ZlcnZpZXcpe3RhcmdldD0iX2JsYW5rIn0gb3IgW0dTTVJdKGh0dHA6Ly9jbnNnZW5vbWljcy5jb20vc29mdHdhcmUvZ3Ntci8pe3RhcmdldD0iX2JsYW5rIn0gZnVuY3Rpb24gZnJvbSBHQ1RBLCBvciB3aXRoIFItcGFja2FnZXMsIGxpa2UgW2BUd29TYW1wbGVNUmBdKGh0dHBzOi8vbXJjaWV1LmdpdGh1Yi5pby9Ud29TYW1wbGVNUi8pe3RhcmdldD0iX2JsYW5rIn0uCgoKIyMgRGlkIHlvdSBjaG9vc2U/CgpOb3cgaXMgdGhlIG1vbWVudCBvZiBkZWNpc2lvbi4gWW91IHNob3VsZCBvcHQgZm9yIHRoZSAqKkNvQ2FsYyoqLWluc3RydWN0aW9ucyB3aGVuIHlvdSBmb2xsb3dpbmcgdGhlIGNvdXJzZS4gSW4gYWxsIG90aGVyIGNhc2VzLCB5b3VyIGJlc3QgYmV0IGFyZSB0aGUgKipTdGFuZGFsb25lKiotaW5zdHJ1Y3Rpb25zLiAKCkdvIHRvIENoYXB0ZXIgXEByZWYoZ2V0dGluZy1zdGFydGVkLXN0YW5kYWxvbmUpIGZvciB0aGUgKipTdGFuZGFsb25lKiotaW5zdHJ1Y3Rpb25zLgoKR28gdG8gQ2hhcHRlciBcQHJlZihnZXR0aW5nLXN0YXJ0ZWQtY29jYWxjKSBmb3IgdGhlICoqQ29DYWxjKiotaW5zdHJ1Y3Rpb25zLgoKPCEtLSBgYGB7anMsIGVjaG8gPSBGQUxTRX0gLS0+CjwhLS0gdGl0bGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWRlcicpOyAtLT4KPCEtLSB0aXRsZS5pbm5lckhUTUwgPSAnPGltZyBzcmM9ImltZy9faGVhZGVycy93b21lbl9iZWhpbmRfbWFjYm9vay5wbmciIGFsdD0iR2V0dGluZyBzdGFydGVkIj4nICsgdGl0bGUuaW5uZXJIVE1MIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS1jaGFwdGVyOmVuZDowMl8zX2dldHRpbmdzdGFydGVkX3Byb2dyYW1zLlJtZC0tPgoKIyBHZXR0aW5nIHN0YXJ0ZWQgLSBTdGFuZGFsb25lIHsjZ2V0dGluZy1zdGFydGVkLXN0YW5kYWxvbmV9CjwhLS0gIVtdKC4vaW1nL19oZWFkZXJzL3dvbWVuX2JlaGluZF9tYWNib29rLnBuZyl7d2lkdGg9MTAwJX0gLS0+CgoKCgoKClNvLCB5b3UgcGxhbiB0byB1c2UgdGhpcyBib29rIGFzICdTdGFuZGFsb25lJyBvbiBhIG1hY09TIGVudmlyb25tZW50LiBUaGlzIG1lYW5zIHlvdSdsbCBuZWVkIHRvIGluc3RhbGwgYSBmZXcgdGhpbmdzIGZpcnN0LgoKIyMgVGhlIGRhdGEgeW91IG5lZWQKCllvdSdsbCBuZWVkIHRvIHN0YXJ0IGJ5IGRvd25sb2FkaW5nIHRoZSBkYXRhIHlvdSBuZWVkIGZvciB0aGlzIHByYWN0aWNhbCB0byB5b3VyIERlc2t0b3AuIAoKSGVyZSdzIHRoZSBsaW5rIHRvIHRoZSBkYXRhLiAKCltMaW5rIHRvIEdvb2dsZSBEcml2ZSB3aXRoIGRhdGFdKGh0dHBzOi8vZHJpdmUuZ29vZ2xlLmNvbS9kcml2ZS9mb2xkZXJzLzFpRExCMXk1MzREZmdFWk5QQ1lCcklqNVg3Z19YbEJiYT91c3A9c2hhcmVfbGluayl7dGFyZ2V0PSJfYmxhbmsifQoKTWFrZSBzdXJlIHlvdSBwdXQgdGhlIGRhdGEgaW4gdGhlIGB+L0Rlc2t0b3AvcHJhY3RpY2FsL2AgZm9sZGVyLgoKVGhlIGRhdGEgYXJlIHByZXR0eSBsYXJnZSAoYXBwcm94LiAxNUdiKSwgc28gdGhpcyB3aWxsIHRha2UgYSBtaW51dGUgb3IgdHdvIGRlcGVuZGluZyBvbiB5b3VyIGludGVybmV0IGNvbm5lY3Rpb24uIFRpbWUgdG8gc3RyZXRjaCB5b3VyIGxlZ3Mgb3IgZ3JhYiBhIGNvZmZlZSAoZGF0YSBzY2llbnRpc3RzIGRvbid0IGRyaW5rIHRlYSkuIAoKPiBOb3RlOiB0aGUgV1RDQ0MxIGRhdGEgYXJlIG5vdCBhdmFpbGFibGUgZm9yIHB1YmxpYyBkb3dubG9hZCwgYXMgeW91IG5lZWQgcGVybWlzc2lvbiB0byB1c2UgdGhlbS4gSG93ZXZlciwgd2UgZG8gcHJvdmlkZSB0aGUgaW5zdHJ1Y3Rpb25zIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHlvdXIgV1RDQ0MxIGRhdGEgd2lsbCBiZSBvbiBnZW5vbWUgYnVpbGQgMzcgYW5kIGltcHV0ZWQgYWdhaW5zdCAxMDAwRyBwaGFzZSAzLgoKIyMgVGVybWluYWwgCgpGb3IgYWxsIHRoZSBwcm9ncmFtcyB3ZSB1c2UsIGV4Y2VwdCAqKlJTdHVkaW8qKiwgeW91IHdpbGwgbmVlZCB0aGUgKipUZXJtaW5hbCoqLiBUaGlzIGNvbWVzIHdpdGggZXZlcnkgbWFqb3Igb3BlcmF0aW5nIHN5c3RlbTsgb24gV2luZG93cyBpdCBpcyBjYWxsZWQgJ1Bvd2VyU2hlbGwnLCBidXQgbGV0J3Mgbm90IGdvIHRoZXJlLiBBbmQgcmVnYXJkbGVzcywgeW91IHdpbGwgKGhhdmUgdG8gc3RhcnQgdG8pIG1ha2UgeW91ciBvd24gc2NyaXB0cy4gVGhlIGJlbmVmaXQgb2YgdXNpbmcgc2NyaXB0cyBpcyB0aGF0IGVhY2ggc3RlcCBpbiB5b3VyIHdvcmtmbG93IGlzIGNsZWFybHkgc3RpcHVsYXRlZCBhbmQgYW5ub3RhdGVkLCBhbmQgaXQgYWxsb3dzIGZvciBncmVhdGVyIHJlcHJvZHVjaWJpbGl0eSwgZWFzaWVyIHRyb3VibGVzaG9vdGluZywgYW5kIHNjYWxpbmcgdXAgdG8gaGlnaC1wZXJmb3JtYW5jZSBjb21wdXRlciBjbHVzdGVycy4KCk9wZW4gdGhlICoqVGVybWluYWwqKiwgaXQgc2hvdWxkIGJlIG9uIHRoZSBsZWZ0IGluIHRoZSB0b29sYmFyIGFzIGEgbGl0dGxlIGJsYWNrIGNvbXB1dGVyLW1vbml0b3ItbGlrZSBpY29uLiBNYWMgdXNlcnMgY2FuIHR5cGUgYGNvbW1hbmQgKyBzcGFjZWAgYW5kIHR5cGUgYHRlcm1pbmFsYCwgYSAqKlRlcm1pbmFsKiogc2NyZWVuIHNob3VsZCBvcGVuLgoKPiBGcm9tIG5vdyBvbiB3ZSB3aWxsIHVzZSBsaXR0bGUgY29kZSBibG9ja3MgbGlrZSB0aGUgZXhhbXBsZSB0byBpbmRpY2F0ZSBhIGNvZGUgeW91IHNob3VsZCB0eXBlL2NvcHktcGFzdGUgYW5kIGhpdCBlbnRlci4gSWYgYSBjb2RlIGlzIGZvbGxvd2VkIGJ5IGEgY29tbWVudCwgaXQgaXMgaW5kaWNhdGVkIGJ5IGEgIyAtIHlvdSBkb24ndCBuZWVkIHRvIGNvcHktcGFzdGUgYW5kIGV4ZWN1dGUgdGhpcy4KCmBgYApDT0RFIEJMT0NLCgpDT0RFIEJMT0NLICMgc29tZSBjb21tZW50IGhlcmUKYGBgCgojIyBOYXZpZ2F0aW5nIHRoZSBUZXJtaW5hbAoKWW91IGNhbiBuYXZpZ2F0ZSBhcm91bmQgdGhlIGNvbXB1dGVyIHRocm91Z2ggdGhlIHRlcm1pbmFsIGJ5IHR5cGluZyBgY2QgPHBhdGg+YDsgYGNkYCBzdGFuZHMgZm9yICJjaGFuZ2UgZGlyZWN0b3J5IiBhbmQgYDxwYXRoPmAgbWVhbnMgInNvbWVfZmlsZV9kaXJlY3RvcnlfeW91X3dhbnRfdG9fZ29fdG8iLgoKClRoaXMgY29tbWFuZCB3aWxsIGJyaW5nIHlvdSB0byB5b3VyIGhvbWUgZGlyZWN0b3J5LgoKYGBgCmNkIH4gCmBgYAoKVGhpcyB3aWxsIGJyaW5nIHlvdSB0byB0aGUgcGFyZW50IGRpcmVjdG9yeSAodXAgb25lIGxldmVsKS4KCmBgYApjZCAuLi8gCmBgYAoKVGhpcyB3aWxsIGJyaW5nIHlvdSB0byB0aGUgWFhYIGRpcmVjdG9yeS4KCmBgYApjZCBYWFggCmBgYAoKCkxldCdzIG5hdmlnYXRlIHRvIHRoZSBmb2xkZXIgeW91IGp1c3QgZG93bmxvYWRlZC4KCmBgYApjZCB+L0Rlc2t0b3AvcHJhY3RpY2FsCmBgYAoKCkxldCdzIGNoZWNrIG91dCB3aGF0IGlzIGluc2lkZSB0aGUgZGlyZWN0b3J5LCBieSBsaXN0aW5nIChgbHNgKSBpdHMgY29udGVudHMuCgpUaGlzIGNvbW1hbmQgc2hvd3MgZmlsZXMgYXMgbGlzdDsgdGhlIGAtbGAgbWFrZXMgaXQgYSB2ZXJ0aWNhbCBsaXN0IGFuZCBhZGRzIG1vcmUgaW5mb3JtYXRpb24sIHlvdSBjYW4gYWxzbyByZW1vdmUgaXQgYW5kIHNpbXBseSB0eXBlIGBsc2AgLSBnbyBvbiwgYW5kIHRyeS4KCmBgYApscyAtbCAKYGBgCgoKVGhpcyBjb21tYW5kIHNob3dzIGZpbGVzIGFzIGxpc3Qgd2l0aCBodW1hbiByZWFkYWJsZSBmb3JtYXQuCgpgYGAKbHMgLWxoIApgYGAKQWRkaW5nIHRoZSBmbGFncyBgLWxoYCB3aWxsIGdldCB5b3UgdGhlIGNvbnRlbnRzIG9mIGEgZGlyZWN0b3J5IGluIGEgbGlzdCAoYC1sYCkgYW5kIG1ha2UgdGhlIHNpemUgJ2h1bWFuLXJlYWRhYmxlJyAoYC1oYCkuCgpBZGRpbmcgYC10YCBzaG93cyB0aGUgZmlsZXMgYXMgbGlzdCBzb3J0ZWQgYnkgdGltZSBlZGl0ZWQuCgpgYGAKbHMgLWx0IApgYGAKCkFkZGluZyBgLVNgIHNob3dzIHRoZSBmaWxlcyBhcyBsaXN0IHNvcnRlZCBieSBzaXplLgoKYGBgCmxzIC1sUyAKYGBgCgpZb3UgY2FuIGFsc28gY291bnQgdGhlIG51bWJlciBvZiBmaWxlcy4gSnVzdCAncGlwZScgdGhlIHJlc3VsdCBmcm9tIGBsc2AgdG8gdGhlIG5leHQgcHJvZ3JhbSBgd2NgICgnd29yZGNvdW50JykgYW5kIGxpc3QgdGhlIG51bWJlciBvZiBsaW5lcywgYC1sYC4gSW4gdGhpcyBjYXNlIGAtbGAgaXMgYSBmbGFnIHVzZWQgYnkgYHdjYCBhbmQgaXQgaGFzIGEgZGlmZmVyZW50IG1lYW5pbmcgdGhhbiBpdCBkb2VzIGZvciBgbHNgLiAKCmBgYApscyB8IHdjIC1sCmBgYAoKQW5kIGlmIHlvdSB3YW50IHRvIGtub3cgYWxsIHRoZSBmdW5jdGlvbiBvZiBhIHByb2dyYW0gc2ltcGx5IHR5cGUgdGhlIGZvbGxvd2luZy4KCmBgYAptYW4gbHMKYGBgCgpUaGlzIHdpbGwgdGFrZSB5b3UgdG8gYSBtYW51YWwgb2YgdGhlIHByb2dyYW0gd2l0aCBhbiBleHRlbnNpdmUgZGVzY3JpcHRpb24gb2YgZWFjaCBmbGFnIChGaWd1cmUgXEByZWYoZmlnOmxzbWFudWFsKSkuCgo8ZGl2IGNsYXNzPSJmaWd1cmUiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPgo8aW1nIHNyYz0iaW1nL2xzX21hbnVhbC5wbmciIGFsdD0iUGFydGlhbCBvdXRwdXQgZnJvbSB0aGUgbHMgbWFudWFsLiIgd2lkdGg9Ijg1JSIgLz4KPHAgY2xhc3M9ImNhcHRpb24iPihcI2ZpZzpsc21hbnVhbClQYXJ0aWFsIG91dHB1dCBmcm9tIHRoZSBscyBtYW51YWwuPC9wPgo8L2Rpdj4KCiMjIEluc3RhbGxpbmcgdGhlIHNvZnR3YXJlCgojIyMgYnJldwoKTGludXggaGFzIGEgZ3JlYXQgcGFja2FnZS1tYW5hZ2VyIHRoYXQgaXMgbGFja2luZyBvbiBtYWNPUy4gWW91IGNhbiBpbnN0YWxsIFtgYnJld2BdKGh0dHBzOi8vYnJldy5zaCl7dGFyZ2V0PSJfYmxhbmsifSB0byBjb21wZW5zYXRlIGZvciB0aGlzLiBUaGlzIGFkZHMgdGhlIGFiaWxpdHkgdG8gaW5zdGFsbCBhbG1vc3QgYW55IExpbnV4LWJhc2VkIHByb2dyYW0gdGhyb3VnaCB0aGUgKipUZXJtaW5hbCoqIHN1Y2ggYXMgYHdnZXRgLCBgbGx2bWAsIGV0Yy4gCgpPcGVuICoqVGVybWluYWwqKiBhbmQgZXhlY3V0ZSB0aGUgZm9sbG93aW5nOgoKYGBgCi9iaW4vYmFzaCAtYyAiJChjdXJsIC1mc1NMIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9Ib21lYnJldy9pbnN0YWxsL0hFQUQvaW5zdGFsbC5zaCkiCmBgYAoKQ2hlY2sgaWYgZXZlcnl0aGluZyBpcyBpbiBvcmRlci4KCmBgYApicmV3IGRvY3RvcgpgYGAKCkl0IHNob3VsZG4ndCByZXBvcnQgYW55IGVycm9ycy4KCiMjIyBQTElOSwoKRmlyc3QsIHdlJ2xsIGdldCBgUExJTktgLiBOYXZpZ2F0ZSB0byB0aGUgKipQTElOSyB2MS45Kiogd2Vic2l0ZSwgd2hpY2ggY2FuIGJlIGZvdW5kIFtoZXJlXShodHRwczovL3d3dy5jb2ctZ2Vub21pY3Mub3JnL3BsaW5rMil7dGFyZ2V0PSJfYmxhbmsifS4gRG93bmxvYWQgdGhlIG1hY09TICg2NC1iaXQpIHZlcnNpb24gdW5kZXIgJ1N0YWJsZSAoYmV0YSB4LngsIGRheSBtb250aCB5ZWFyKScuIAoKPiBOb3RlOiBBcHBsZSBwcm9kdWNlZCBJbnRlbC1iYXNlZCBjb21wdXRlcnMgZm9yIGEgZmV3IHllYXJzIGJhY2ssIGFuZCBtb3N0IHByb2dyYW1zLCBwYWNrYWdlcywgbGlicmFyaWVzIGFuZCB3aGF0bm90IGFyZSBkZXNpZ25lZCBmb3IgdGhhdC4gU28sIEkgaGlnaGx5IHJlY29tbWVuZCB1c2luZyBzb2Z0d2FyZSBkZXNpZ25lZCBmb3IgdGhhdCBhbmQgYWN0aXZhdGluZyBSb3NldHRhMiBpbiB5b3VyIFRlcm1pbmFsLiBEb24ndCBrbm93IGhvdyB0byBkbyB0aGF0PyBGb2xsb3dpbmcgW3RoZXNlIGluc3RydWN0aW9uc10oaHR0cHM6Ly9zdXBwb3J0LmFwcGxlLmNvbS9lbi11cy8xMDI1Mjcpe3RhcmdldD0iX2JsYW5rIn0uCgpVbnppcCB0aGUgZm9sZGVyIGFuZCBwdXQgYHBsaW5rYCBpbiB0aGUgcHJhY3RpY2FsIGZvbGRlci4gCgpgYGAKbXYgLXYgfi9Eb3dubG9hZHMvcGxpbmtfbWFjXzIwMjMxMjExL3BsaW5rIH4vRGVza3RvcC9wcmFjdGljYWwvcGxpbmsgCmBgYAoKIyMjIEluc3RhbGxpbmcgUiBhbmQgUlN0dWRpbwoKTGV0J3MgZ28gYWhlYWQgYW5kIHVzZSBgYnJld2AgdG8gaW5zdGFsbCB0aGUgYFJgIGFuZCAqKlJTdHVkaW8qKiBzb2Z0d2FyZS4KCkluICoqVGVybWluYWwqKiBleGVjdXRlIHRoZSBmb2xsb3dpbmcgYW5kIGp1c3QgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMuCgpgYGAKYnJldyBpbnN0YWxsIHJzdHVkaW8KYnJldyBpbnN0YWxsIC0tY2FzayByCmBgYAoKTm93IGNsb3NlIHRoZSB0ZXJtaW5hbCB3aW5kb3cgLSByZWFsbHkgbWFrZSBzdXJlIHRoYXQgdGhlIHRlcm1pbmFsLXByb2dyYW0gaGFzIHF1aXQuCgpPcGVuIHlvdXIgZnJlc2ggaW5zdGFsbGF0aW9uIG9mICoqUlN0dWRpbyoqIGJ5IGRvdWJsZSBjbGlja2luZyB0aGUgaWNvbi4gWW91IHNob3VsZCBiZSBzZWVpbmcgc29tZXRoaW5nIGxpa2UgZmlndXJlIFxAcmVmKGZpZzpyc3R1ZGlvc2NyZWVuc2hvdCkKCjxkaXYgY2xhc3M9ImZpZ3VyZSIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+CjxpbWcgc3JjPSJpbWcvcnN0dWRpby1zY3JlZW5zaG90LnBuZyIgYWx0PSJSU3R1ZGlvIHNjcmVlbnNob3QuIiB3aWR0aD0iODUlIiAvPgo8cCBjbGFzcz0iY2FwdGlvbiI+KFwjZmlnOnJzdHVkaW9zY3JlZW5zaG90KVJTdHVkaW8gc2NyZWVuc2hvdC48L3A+CjwvZGl2PgoKCkluIHRoZSB0b3AgcmlnaHQsIHlvdSBzZWUgYSBsaXR0bGUgZ3JlZW4td2hpdGUgcGx1cy1zaWduLCBjbGljayB0aGlzIGFuZCBzZWxlY3QgJ1IgTm90ZWJvb2snIChGaWd1cmUgXEByZWYoZmlnOnJzdHVkaW9zY3JlZW5zaG90Y3JlYXRlbm90ZWJvb2spKS4gCgo8ZGl2IGNsYXNzPSJmaWd1cmUiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPgo8aW1nIHNyYz0iaW1nL3JzdHVkaW8tc2NyZWVuc2hvdC1jcmVhdGUtbm90ZWJvb2sucG5nIiBhbHQ9IlJTdHVkaW8gc2NyZWVuc2hvdC4iIHdpZHRoPSI4NSUiIC8+CjxwIGNsYXNzPSJjYXB0aW9uIj4oXCNmaWc6cnN0dWRpb3NjcmVlbnNob3RjcmVhdGVub3RlYm9vaylSU3R1ZGlvIHNjcmVlbnNob3QuPC9wPgo8L2Rpdj4KCllvdSB3aWxsIGNyZWF0ZSBhbiB1bnRpdGxlZCAoYFVudGl0bGVkMWApIGBSYCBub3RlYm9vazogeW91IGNhbiBjb21iaW5lIHRleHQgZGVzY3JpcHRpb25zLCBsaWtlIHlvdSB3b3VsZCBpbiBhIGxhYi1qb3VybmFsLCB3aXRoIGNvZGUtc2VjdGlvbnMuIFJlYWQgd2hhdCBpcyBpbiB0aGUgbm90ZWJvb2sgdG8gZ2V0IGEgZ3Jhc3Agb24gdGhhdCAoRmlndXJlIFxAcmVmKGZpZzpyc3R1ZGlvc2NyZWVuc2hvdG5vdGVib29rKSkuIAoKPGRpdiBjbGFzcz0iZmlndXJlIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj4KPGltZyBzcmM9ImltZy9yc3R1ZGlvLXNjcmVlbnNob3Qtbm90ZWJvb2sucG5nIiBhbHQ9IlJTdHVkaW8gc2NyZWVuc2hvdC4iIHdpZHRoPSI4NSUiIC8+CjxwIGNsYXNzPSJjYXB0aW9uIj4oXCNmaWc6cnN0dWRpb3NjcmVlbnNob3Rub3RlYm9vaylSU3R1ZGlvIHNjcmVlbnNob3QuPC9wPgo8L2Rpdj4KClJpZ2h0LCB5b3Ugc2hvdWxkIGJlIGluc3RhbGxpbmcgc29tZSBwYWNrYWdlcy4gVG8gZG8gc28sIHlvdSBjYW4gcmVtb3ZlIGBwbG90KGNhcnMpYCAob3IgbGVhdmUgYW5kIGNyZWF0ZSBhIG5ldyBjb2RlLWJsb2NrIGFzIHBlciBpbnN0cnVjdGlvbnMgaW4gdGhlIG5vdGVib29rKSwgYW5kIGNvcHkgcGFzdGUgdGhlIGNvZGUgYmVsb3cuIE1ha2Ugc3VyZSB0byBwdXQgaW4gYSBjb2RlIGJsb2NrIGxpa2UgdGhlIGV4YW1wbGUgaW4gd2hpY2ggYHBsb3QoY2FycylgIGlzIGluLgoKYGBgCnJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKGMoInJzdHVkaW8vcm1hcmtkb3duIikpCgppbnN0YWxsLnBhY2thZ2VzKGMoImZvcm1hdFIiLCAicmVtb3RlcyIsIAogICAgICAgICAgICAgICAgICAgImh0dHIiLCAidXNldGhpcyIsIAogICAgICAgICAgICAgICAgICAgImRhdGEudGFibGUiLCAiZGV2dG9vbHMiLCAKICAgICAgICAgICAgICAgICAgICJkcGx5ciIsICJ0aWJibGUiLCAidGlkeXZlcnNlIiwgCiAgICAgICAgICAgICAgICAgICAib3Blbnhsc3giLAogICAgICAgICAgICAgICAgICAgImdncGxvdDIiLAogICAgICAgICAgICAgICAgICAgImdnc2NpIiwgImdndGhlbWVzIiwKICAgICAgICAgICAgICAgICAgICJxcW1hbiIsICJDTXBsb3QiLCAicGxvdGx5IiwgCiAgICAgICAgICAgICAgICAgICAib3Blbnhsc3giKSkKZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJrYXNzYW1iYXJhL2dncHViciIpCgpkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoIm9saXZpYXNhYmlrL1JBQ0VSIikKCnJlbW90ZXM6Omluc3RhbGxfZ2l0aHViKCJNUkNJRVUvVHdvU2FtcGxlTVIiKQpkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoIk1SQ0lFVS9NUkluc3RydW1lbnRzIikKCmlmICghcmVxdWlyZSgiQmlvY01hbmFnZXIiLCBxdWlldGx5ID0gVFJVRSkpCiAgaW5zdGFsbC5wYWNrYWdlcygiQmlvY01hbmFnZXIiKQpCaW9jTWFuYWdlcjo6aW5zdGFsbCgiZ2VuZXBsb3R0ZXIiKQpgYGAKCllvdSBzaG91bGQgbG9hZCB0aGVzZSBwYWNrYWdlcyB0b28uIAoKYGBgCmxpYnJhcnkocm1hcmtkb3duKQpsaWJyYXJ5KGZvcm1hdFIpCgpsaWJyYXJ5KG9wZW54bHN4KQoKbGlicmFyeShkYXRhLnRhYmxlKQoKbGlicmFyeSh0aWJibGUpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHBsb3RseSkKCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkZXZ0b29scykKbGlicmFyeShnZ3B1YnIpCmxpYnJhcnkoZ2dzY2kpCmxpYnJhcnkoZ2d0aGVtZXMpCgpsaWJyYXJ5KHFxbWFuKQpsaWJyYXJ5KENNcGxvdCkKbGlicmFyeShSQUNFUikKCmxpYnJhcnkocmVtb3RlcykKbGlicmFyeShUd29TYW1wbGVNUikKbGlicmFyeShNUkluc3RydW1lbnRzKQoKbGlicmFyeSgiZ2VuZXBsb3R0ZXIiKQpgYGAKCkFsbCBpbiBhbGwgdGhpcyBtYXkgdGFrZSBzb21lIHRpbWUsIGdvb2QgbW9tZW50IHRvIHJlbGF4LCByZXZpZXcgeW91ciBub3Rlcywgc3RyZXRjaCB5b3VyIGxlZ3MsIG9yIHRha2UgYSBjb2ZmZWUuCgoKIyMgQXJlIHlvdSByZWFkeT8KCkFyZSB5b3UgcmVhZHk/IERpZCB5b3UgYnJpbmcgY29mZmVlIGFuZCBhIGdvb2QgZG9zZSBvZiBlbmVyZ3k/IExldCdzIHN0YXJ0ISAKCk9oLCBvbmUgbW9yZSB0aGluZzogeW91IGNhbiBzYXZlIHlvdXIgbm90ZWJvb2ssIHRoZSBvbmUgeW91IGp1c3QgY3JlYXRlZCwgdG8ga2VlcCBhbGwgdGhlIGBSYCBjb2RlcyB5b3UgYXJlIGFwcGx5aW5nIGluIHRoZSBuZXh0IGNoYXB0ZXJzIGFuZCBhZGQgZGVzY3JpcHRpb25zIGFuZCBub3Rlcy4gSWYgeW91IHNhdmUgdGhpcyBub3RlYm9vayB5b3UnbGwgbm90aWNlIHRoYXQgYSBgaHRtbGAtZmlsZSBpcyBjcmVhdGVkLiBUaGlzIGZpbGUgaXMgYSBsZWdpYmxlIHdlYmJyb3dzZXItZnJpZW5kbHkgdmVyc2lvbiBvZiB5b3VyIHdvcmsgYW5kIGNvbnRhaW5zIHRoZSBjb2RlcyBhbmQgdGhlIG91dHB1dCAoY29kZSBtZXNzYWdlcywgdGFibGVzLCBhbmQgZmlndXJlcykuIEFuZCB0aGUgbmljZSB0aGluZyBpcywgdGhhdCB5b3UgY2FuIGVhc2lseSBzaGFyZSBpdCB3aXRoIG90aGVycyBvdmVyIGVtYWlsLiAKCk9rLiAnTm91Z2ggc2FpZCwgbGV0J3MgbW92ZSBvbiB0byBjb3ZlciBzb21lIGJhc2ljcyBpbiBDaGFwdGVyIFxAcmVmKGd3YXMtYmFzaWNzKS4KCjwhLS0gYGBge2pzLCBlY2hvID0gRkFMU0V9IC0tPgo8IS0tIHRpdGxlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFkZXInKTsgLS0+CjwhLS0gdGl0bGUuaW5uZXJIVE1MID0gJzxpbWcgc3JjPSJpbWcvX2hlYWRlcnMvd29tZW5fYmVoaW5kX21hY2Jvb2sucG5nIiBhbHQ9IkdldHRpbmcgc3RhcnRlZCI+JyArIHRpdGxlLmlubmVySFRNTCAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tY2hhcHRlcjplbmQ6MDJfNF9nZXR0aW5nc3RhcnRlZF9zdGFuZGFsb25lLlJtZC0tPgoKIyBHZXR0aW5nIHN0YXJ0ZWQgLSBDb0NhbGMgeyNnZXR0aW5nLXN0YXJ0ZWQtY29jYWxjfQo8IS0tICFbXSguL2ltZy9faGVhZGVycy93b21lbl9iZWhpbmRfbWFjYm9vay5wbmcpe3dpZHRoPTEwMCV9IC0tPgoKCgoKCgpOb3csIHBheSBhdHRlbnRpb24uIElmIHlvdSBjYW1lIGhlcmUgdGhyb3VnaCB0aGUgY291cnNlICoqR2VuZXRpYyBFcGlkZW1pb2xvZ3kqKiwgeW91IGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcuIEFsbCB0aGUgZGF0YSB5b3UgbmVlZCBhcmUgYWxyZWFkeSBkb3dubG9hZGVkIGFuZCBldmVyeXRoaW5nIHdhcyBzZXQgdXAgZm9yIG9uIHRoZSBzZXJ2ZXIsIGp1c3QgZm9sbG93IHRoZSBbbGlua10oaHR0cHM6Ly9jb2NhbGMxLnNjaWVuY2UudXUubmwvKXt0YXJnZXQ9Il9ibGFuayJ9IGFzIHByb3ZpZGVkIGJ5IHRoZSBjb3Vyc2UtaW5zdHJ1Y3RvcnMuIAoKSGVyZSB3ZSBwcm92aWRlIGEgZmV3IHNob3J0IGluc3RydWN0aW9ucyB0byBuYXZpZ2F0ZSAqKkNvQ2FsYyoqLgoKCiMjIFN0YXJ0aW5nIHRoZSBjb3Vyc2Ugb24gQ29DYWxjCgpPbmNlIGxvZ2dlZCBpbiB5b3Ugc2hvdWxkIHNlZSBhIHNjcmVlbiBzaW1pbGFyIHRvIHRoZSBvbmUgYmVsb3cuCgo8ZGl2IGNsYXNzPSJmaWd1cmUiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPgo8aW1nIHNyYz0iaW1nL19jb2NhbGMvY29jYWxjX3N0YXJ0LnBuZyIgYWx0PSJDb0NhbGMgYWZ0ZXIgbG9nZ2luZyBpbi4iIHdpZHRoPSI4NSUiIC8+CjxwIGNsYXNzPSJjYXB0aW9uIj4oXCNmaWc6Y29jYWxjc3RhcnQpQ29DYWxjIGFmdGVyIGxvZ2dpbmcgaW4uPC9wPgo8L2Rpdj4KCk5hdmlnYXRlIHRvIHRoZSBDb3Vyc2UgYnkgY2xpY2tpbmcgb24gdGhlIGJsdWUgX1lvdXIgVUJDIENvQ2FsYyAxIHByb2plY3RzLi4uXy1idXR0b24gYW5kIHNlbGVjdGluZyB0aGUgY291cnNlICoqR2VuZXRpYyBFcGlkZW1pb2xvZ3kqKiB5b3UgYXJlIGZvbGxvd2luZy4gCgo8ZGl2IGNsYXNzPSJmaWd1cmUiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPgo8aW1nIHNyYz0iaW1nL19jb2NhbGMvY29jYWxjX3Byb2plY3RzLnBuZyIgYWx0PSJDb0NhbGMgcHJvamVjdHMuIiB3aWR0aD0iODUlIiAvPgo8cCBjbGFzcz0iY2FwdGlvbiI+KFwjZmlnOmNvY2FsY3Byb2plY3RzKUNvQ2FsYyBwcm9qZWN0cy48L3A+CjwvZGl2PgoKT25jZSB5b3UgYXJlIGluIHRoZSBjb3Vyc2UsIHlvdSB3aWxsIHNlZSBhIHNjcmVlbiBsaWtlIHRoaXMgb25lIGJlbG93LgoKPGRpdiBjbGFzcz0iZmlndXJlIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj4KPGltZyBzcmM9ImltZy9fY29jYWxjL2NvY2FsY19zdHVkZW50X21haW4ucG5nIiBhbHQ9IkNvQ2FsYyBzdHVkZW50IHBhZ2UuIiB3aWR0aD0iODUlIiAvPgo8cCBjbGFzcz0iY2FwdGlvbiI+KFwjZmlnOmNvY2FsY3N0dWRlbnRtYWluKUNvQ2FsYyBzdHVkZW50IHBhZ2UuPC9wPgo8L2Rpdj4KCkluIHRoZSBfQ291cnNlIEJvb2tfIHlvdSdsbCBmaW5kIHRoZSBoYW5kb3V0cyB5b3UgbmVlZC4gSW4gdGhlIHNoYXJlIF9kYXRhXyBmb2xkZXIgeW91IHdpbGwgZmluZCB0aGUgZGF0YSB5b3UnbGwgbmVlZC4gCgojIyBCZWdpbm5pbmcgeW91ciBvd24gbm90ZWJvb2sKCklmIHlvdSB3YW50IHRvIHN0YXJ0IHlvdXIgb3duIG5vdGVib29rLCB5b3UgY2FuIGRvIHNvIGJ5IGNsaWNraW5nIG9uIHRoZSBfTmV3XyBidXR0b24gYW5kIHNlbGVjdGluZyBfSnVweXRlciBOb3RlYm9va18uCgo8ZGl2IGNsYXNzPSJmaWd1cmUiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPgo8aW1nIHNyYz0iaW1nL19jb2NhbGMvY29jYWxjX25vdGVib29rLnBuZyIgYWx0PSJDb0NhbGMgbmV3IG5vdGVib29rLiIgd2lkdGg9Ijg1JSIgLz4KPHAgY2xhc3M9ImNhcHRpb24iPihcI2ZpZzpjb2NhbGNfbm90ZWJvb2spQ29DYWxjIG5ldyBub3RlYm9vay48L3A+CjwvZGl2PgoKWW91IHdpbGwgcHJvYmFibHkgZ2V0IGEgc2NyZWVuIGFza2luZyB5b3UgdG8gc2VsZWN0IGEga2VybmVsLiBZb3UgY2FuIGNob29zZSBfUl8uCgo8ZGl2IGNsYXNzPSJmaWd1cmUiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPgo8aW1nIHNyYz0iaW1nL19jb2NhbGMvY29jYWxjX25vdGVib29rX2tlcm5lbC5wbmciIGFsdD0iQ29DYWxjIGtlcm5lbCBzZWxlY3Rpb24uIiB3aWR0aD0iODUlIiAvPgo8cCBjbGFzcz0iY2FwdGlvbiI+KFwjZmlnOmNvY2FsY25vdGJvb2trZXJuZWwpQ29DYWxjIGtlcm5lbCBzZWxlY3Rpb24uPC9wPgo8L2Rpdj4KCk5vdyB5b3UgYXJlIHJlYWR5IHRvIHN0YXJ0IHlvdXIgb3duIG5vdGVib29rIC0gbGlrZSBiZWxvdy4gWW91IGNhbiBjcmVhdGUgYSBuZXcgJ2NlbGwnIHdpdGggZm9ybWF0ICdjb2RlJyBvciAndGV4dCcgb3IgJ21hcmtkb3duJyBhbmQgc3RhcnQgdHlwaW5nLiAKCjxkaXYgY2xhc3M9ImZpZ3VyZSIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+CjxpbWcgc3JjPSJpbWcvX2NvY2FsYy9jb2NhbGNfbm90ZWJvb2tfcl9tYXJrZG93bi5wbmciIGFsdD0iQ29DYWxjIHN0YXJ0aW5nIHlvdXIgbm90ZWJvb2suIiB3aWR0aD0iODUlIiAvPgo8cCBjbGFzcz0iY2FwdGlvbiI+KFwjZmlnOmNvY2FsY25vdGVib29rcm1hcmtkb3duKUNvQ2FsYyBzdGFydGluZyB5b3VyIG5vdGVib29rLjwvcD4KPC9kaXY+CgoKIyMgQXJlIHlvdSByZWFkeT8KCkFyZSB5b3UgcmVhZHk/IERpZCB5b3UgYnJpbmcgY29mZmVlIGFuZCBhIGdvb2QgZG9zZSBvZiBlbmVyZ3k/IExldCdzIHN0YXJ0ISAKCk9oLCBvbmUgbW9yZSB0aGluZzogeW91IGNhbiBzYXZlIHlvdXIgbm90ZWJvb2ssIHRoZSBvbmUgeW91IGp1c3QgY3JlYXRlZCwgdG8ga2VlcCBhbGwgdGhlIGBSYCBjb2RlcyB5b3UgYXJlIGFwcGx5aW5nIGluIHRoZSBuZXh0IGNoYXB0ZXJzIGFuZCBhZGQgZGVzY3JpcHRpb25zIGFuZCBub3Rlcy4gSWYgeW91IHNhdmUgdGhpcyBub3RlYm9vayB5b3UnbGwgbm90aWNlIHRoYXQgYSBgaHRtbGAtZmlsZSBpcyBjcmVhdGVkLiBUaGlzIGZpbGUgaXMgYSBsZWdpYmxlIHdlYmJyb3dzZXItZnJpZW5kbHkgdmVyc2lvbiBvZiB5b3VyIHdvcmsgYW5kIGNvbnRhaW5zIHRoZSBjb2RlcyBhbmQgdGhlIG91dHB1dCAoY29kZSBtZXNzYWdlcywgdGFibGVzLCBhbmQgZmlndXJlcykuIEFuZCB0aGUgbmljZSB0aGluZyBpcywgdGhhdCB5b3UgY2FuIGVhc2lseSBzaGFyZSBpdCB3aXRoIG90aGVycyBvdmVyIGVtYWlsLiAKCk9rLiAnTm91Z2ggc2FpZCwgbGV0J3MgbW92ZSBvbiB0byBjb3ZlciBzb21lIGJhc2ljcyBpbiBDaGFwdGVyIFxAcmVmKGd3YXMtYmFzaWNzKS4KCjwhLS0gYGBge2pzLCBlY2hvID0gRkFMU0V9IC0tPgo8IS0tIHRpdGxlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFkZXInKTsgLS0+CjwhLS0gdGl0bGUuaW5uZXJIVE1MID0gJzxpbWcgc3JjPSJpbWcvX2hlYWRlcnMvd29tZW5fYmVoaW5kX21hY2Jvb2sucG5nIiBhbHQ9IkdldHRpbmcgc3RhcnRlZCI+JyArIHRpdGxlLmlubmVySFRNTCAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tY2hhcHRlcjplbmQ6MDJfNV9nZXR0aW5nc3RhcnRlZF9jb2NhbGMuUm1kLS0+CgojIFN0ZXBzIGluIGEgR2Vub21lLVdpZGUgQXNzb2NpYXRpb24gU3R1ZHkgeyNnd2FzLWJhc2ljc30KPCEtLSAhW10oLi9pbWcvX2hlYWRlcnMvd29tYW5fd29ya2luZ19vbl9jb2RlLnBuZyl7d2lkdGg9MTAwJX0gLS0+CgoKCgoKCk5vdyB0aGF0IHlvdSB1bmRlcnN0YW5kIGEgYml0IG9mIHRoZSBuYXZpZ2F0aW9uIGluIFVuaXgtc3lzdGVtcywgeW91J3JlIHJlYWR5IHRvIHN0YXJ0IHRoaXMgcHJhY3RpY2FsIHByaW1lci4gV2Ugd2lsbCBtYWtlIHVzZSBvZiBhIGR1bW15IGRhdGFzZXQgY29udGFpbmluZyBjYXNlcyBhbmQgY29udHJvbHMuIFdlIHdpbGwgZXhwbGFpbiBhbmQgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOgoKMS4gY29udmVydCByYXcgZGF0YSB0byBhIG1vcmUgbWVtb3J5LWVmZmljaWVudCBmb3JtYXQKMi4gYXBwbHkgZXh0ZW5zaXZlIHF1YWxpdHkgY29udHJvbCBvbiBzYW1wbGVzIGFuZCBTTlBzCjMuIGFzc2VzcyB0aGUgYW5jZXN0cmFsIGJhY2tncm91bmQgb2YgeW91ciBzdHVkeSBwb3B1bGF0aW9uCjQuIHBlcmZvcm0gYXNzb2NpYXRpb24gdGVzdGluZwo1LiB2aXN1YWxpemUgYXNzb2NpYXRpb24gcmVzdWx0cwoKCiMjIENvbnZlcnRpbmcgZGF0YXNldHMKClRoZSBmb3JtYXQgaW4gd2hpY2ggZ2Vub3R5cGUgZGF0YSBhcmUgcmV0dXJuZWQgdG8gaW52ZXN0aWdhdG9ycyB2YXJpZXMgYW1vbmcgZ2Vub21lLXdpZGUgU05QIHBsYXRmb3JtcyBhbmQgZ2Vub3R5cGluZyBjZW50ZXJzLiBVc3VhbGx5IGdlbm90eXBlcyBoYXZlIGJlZW4gY2FsbGVkIGJ5IGEgZ2Vub3R5cGluZyBjZW50ZXIgYW5kIHJldHVybmVkIGluIHRoZSBzdGFuZGFyZCBgUEVEYCBhbmQgYE1BUGAgZmlsZSBmb3JtYXRzIGRlc2lnbmVkIGZvciBgUExJTktgLgoKQSBgUEVEYCBmaWxlIGlzIGEgd2hpdGUgc3BhY2UgKHNwYWNlIG9yIHRhYiktZGVsaW1pdGVkIGZpbGUgaW4gd2hpY2ggZWFjaCBsaW5lIHJlcHJlc2VudHMgb25lIGluZGl2aWR1YWwgYW5kIHRoZSBmaXJzdCBzaXggY29sdW1ucyBhcmUgbWFuZGF0b3J5IGFuZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgoKLSAnRmFtaWx5IElEJywgCi0gJ0luZGl2aWR1YWwgSUQnLCAKLSAnUGF0ZXJuYWwgSUQnLCAKLSAnTWF0ZXJuYWwgSUQnLCAKLSAnU2V4ICgxPW1hbGUsIDI9ZmVtYWxlLCAwPW1pc3NpbmcpJywgYW5kIAotICdQaGVub3R5cGUgKDE9dW5hZmZlY3RlZCwgMj1hZmZlY3RlZCwgMD1taXNzaW5nKScuIAoKVGhlIHN1YnNlcXVlbnQgY29sdW1ucyBkZW5vdGUgZ2Vub3R5cGVzIHRoYXQgY2FuIGJlIGFueSBjaGFyYWN0ZXIgKGUuZy4sIDEsIDIsIDMsIDQgb3IgQSwgQywgRywgVCkuIFplcm8gZGVub3RlcyBhIG1pc3NpbmcgZ2Vub3R5cGUuIEVhY2ggU05QIG11c3QgaGF2ZSB0d28gYWxsZWxlcyAoaS5lLiwgYm90aCBhbGxlbGVzIGFyZSBlaXRoZXIgcHJlc2VudCBvciBhYnNlbnQpLiAKVGhlIG9yZGVyIG9mIFNOUHMgaW4gdGhlIFBFRCBmaWxlIGlzIGdpdmVuIGluIHRoZSBNQVAgZmlsZSwgaW4gd2hpY2ggZWFjaCBsaW5lIGRlbm90ZXMgYSBzaW5nbGUgbWFya2VyIGFuZCB0aGUgZm91ciB3aGl0ZS1zcGFjZeKAk3NlcGFyYXRlZCBjb2x1bW5zIGFyZSBjaHJvbW9zb21lICgx4oCTMjIsIFgsIFkgb3IgMCBmb3IgdW5wbGFjZWQpLCBtYXJrZXIgbmFtZSAodHlwaWNhbGx5IGFuIHJzIG51bWJlciksIGdlbmV0aWMgZGlzdGFuY2UgaW4gTW9yZ2FucyAodGhpcyBjYW4gYmUgZml4ZWQgdG8gMCkgYW5kIGJhc2UtcGFpciBwb3NpdGlvbiAoYnAgdW5pdHMpLgoKTGV0J3Mgc3RhcnQgYnkgdXNpbmcgYFBMSU5LYCB0byBjb252ZXJ0aW5nIHRoZSBkYXRhc2V0cyB0byBhIGxpZ2h0ZXIsIGJpbmFyeSBmb3JtIChhIGAuYmVkYC1maWxlKS4gVGhpcyBmaWxlIHNhdmVzIGRhdGEgaW4gYSBtb3JlIG1lbW9yeS0gYW5kIHRpbWUtZWZmaWNpZW50IG1hbm5lciAoaW4gYSAnYmluYXJ5Jy1mb3JtYXQpIHRvIGZhY2lsaXRhdGUgdGhlIGFuYWx5c2lzIG9mIGxhcmdlLXNjYWxlIGRhdGEgc2V0cyBbQHB1cmNlbGwyMDA3XS4gVGhlIG1hcmtlci1pbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdGhlIGAuYmltYC1maWxlIGFuZCB0aGUgZmFtaWx5IGluZm9ybWF0aW9uIGluIHRoZSBgLmZhbWAtZmlsZS4gYFBMSU5LYCBjcmVhdGVzIGEgYC5sb2dgIGZpbGUgKG5hbWVkIGByYXctR1dBLWRhdGEubG9nYCkgdGhhdCBkZXRhaWxzIChhbW9uZyBvdGhlciBpbmZvcm1hdGlvbikgdGhlIGltcGxlbWVudGVkIGNvbW1hbmRzLCB0aGUgbnVtYmVyIG9mIGNhc2VzIGFuZCBjb250cm9scyBpbiB0aGUgaW5wdXQgZmlsZXMsIGFueSBleGNsdWRlZCBkYXRhIGFuZCB0aGUgZ2Vub3R5cGluZyByYXRlIGluIHRoZSByZW1haW5pbmcgZGF0YS4gVGhpcyBmaWxlIGlzIHZlcnkgdXNlZnVsIGZvciBjaGVja2luZyB3aGV0aGVyIHRoZSBzb2Z0d2FyZSBpcyBzdWNjZXNzZnVsbHkgY29tcGxldGluZyBjb21tYW5kcy4KCk1ha2Ugc3VyZSB5b3UgYXJlIGluIHRoZSByaWdodCBkaXJlY3RvcnkuIERvIHlvdSByZW1lbWJlciBob3cgdG8gZ2V0IHRoZXJlPwoKYGBgCmNkIH4vRGVza3RvcC9wcmFjdGljYWwKYGBgCgpOZXh0LCB3ZSdsbCBtYWtlIGEgcHJvamVjdCBkaXJlY3RvcnkuCgpgYGAKbWtkaXIgLXYgfi9EZXNrdG9wL3ByYWN0aWNhbC9kdW1teV9wcm9qZWN0CmBgYAoKTm93LCB3ZSdsbCBjb252ZXJ0IHRoZSBgLnBlZGAvYC5tYXBgIGZpbGVzIHRvIHRoZSBiaW5hcnktZm9ybWF0LgoKYGBgCnBsaW5rIC0tZmlsZSByYXdkYXRhL3Jhdy1HV0EtZGF0YSAtLW1ha2UtYmVkIC0tb3V0IGR1bW15X3Byb2plY3QvcmF3ZGF0YQpgYGAKCkxldCdzIHJldmlldyB0aGUgYC5sb2dgLWZpbGUgZm9yIGEgYml0LiBJdCBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgoKYGBgClBMSU5LIHYxLjkwYjcuMiA2NC1iaXQgKDExIERlYyAyMDIzKSAgICAgICAgICAgd3d3LmNvZy1nZW5vbWljcy5vcmcvcGxpbmsvMS45LwooQykgMjAwNS0yMDIzIFNoYXVuIFB1cmNlbGwsIENocmlzdG9waGVyIENoYW5nICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMKTG9nZ2luZyB0byBkdW1teV9wcm9qZWN0L3Jhd2RhdGEubG9nLgpPcHRpb25zIGluIGVmZmVjdDoKICAtLWZpbGUgcmF3ZGF0YS9yYXctR1dBLWRhdGEKICAtLW1ha2UtYmVkCiAgLS1vdXQgZHVtbXlfcHJvamVjdC9yYXdkYXRhCgoxNjM4NCBNQiBSQU0gZGV0ZWN0ZWQ7IHJlc2VydmluZyA4MTkyIE1CIGZvciBtYWluIHdvcmtzcGFjZS4KLnBlZCBzY2FuIGNvbXBsZXRlIChmb3IgYmluYXJ5IGF1dG9jb252ZXJzaW9uKS4KUGVyZm9ybWluZyBzaW5nbGUtcGFzcyAuYmVkIHdyaXRlICgzMTc1MDMgdmFyaWFudHMsIDIwMDAgcGVvcGxlKS4KLS1maWxlOiBkdW1teV9wcm9qZWN0L3Jhd2RhdGEtdGVtcG9yYXJ5LmJlZCArCmR1bW15X3Byb2plY3QvcmF3ZGF0YS10ZW1wb3JhcnkuYmltICsgZHVtbXlfcHJvamVjdC9yYXdkYXRhLXRlbXBvcmFyeS5mYW0Kd3JpdHRlbi4KMzE3NTAzIHZhcmlhbnRzIGxvYWRlZCBmcm9tIC5iaW0gZmlsZS4KMjAwMCBwZW9wbGUgKDk5NyBtYWxlcywgMTAwMyBmZW1hbGVzKSBsb2FkZWQgZnJvbSAuZmFtLgoyMDAwIHBoZW5vdHlwZSB2YWx1ZXMgbG9hZGVkIGZyb20gLmZhbS4KVXNpbmcgMSB0aHJlYWQgKG5vIG11bHRpdGhyZWFkZWQgY2FsY3VsYXRpb25zIGludm9rZWQpLgpCZWZvcmUgbWFpbiB2YXJpYW50IGZpbHRlcnMsIDIwMDAgZm91bmRlcnMgYW5kIDAgbm9uZm91bmRlcnMgcHJlc2VudC4KQ2FsY3VsYXRpbmcgYWxsZWxlIGZyZXF1ZW5jaWVzLi4uIGRvbmUuCldhcm5pbmc6IDExNDQwIGhldC4gaGFwbG9pZCBnZW5vdHlwZXMgcHJlc2VudCAoc2VlIGR1bW15X3Byb2plY3QvcmF3ZGF0YS5oaCApOwptYW55IGNvbW1hbmRzIHRyZWF0IHRoZXNlIGFzIG1pc3NpbmcuClRvdGFsIGdlbm90eXBpbmcgcmF0ZSBpcyAwLjk4NTY4Mi4KMzE3NTAzIHZhcmlhbnRzIGFuZCAyMDAwIHBlb3BsZSBwYXNzIGZpbHRlcnMgYW5kIFFDLgpBbW9uZyByZW1haW5pbmcgcGhlbm90eXBlcywgMTAyMyBhcmUgY2FzZXMgYW5kIDk3NyBhcmUgY29udHJvbHMuCi0tbWFrZS1iZWQgdG8gZHVtbXlfcHJvamVjdC9yYXdkYXRhLmJlZCArIGR1bW15X3Byb2plY3QvcmF3ZGF0YS5iaW0gKwpkdW1teV9wcm9qZWN0L3Jhd2RhdGEuZmFtIC4uLiBkb25lLgpgYGAKClNvLCB0aGVyZSBhcmUgMzE3LDUwMyB2YXJpYW50cyBpbmNsdWRlZCBmb3IgMiwwMDAgcGVvcGxlLCA5OTcgbWFsZXMgYW5kIDEsMDAzIGZlbWFsZXMuIEFsbCBvZiB0aGVzZSBpbmRpdmlkdWFscyBhcmUgWydmb3VuZGVycyddKGh0dHBzOi8vd3d3LmNvZy1nZW5vbWljcy5vcmcvcGxpbmsvMS45L2ZpbHRlciNub25mb3VuZGVycyl7dGFyZ2V0PSJfYmxhbmsifS4gVGhlcmUgYXJlIDEsMDIzIGNhc2VzIGFuZCA5NzcgY29udHJvbHMuIFRoZSBnZW5vdHlwaW5nIHJhdGUgaXMgYWJvdXQgOTguNiUgd2hpY2ggaXMgcHJldHR5IGdvb2QuIExhc3RseSwgdGhlcmUgYXJlIDExLDQ0MCBoZXRlcm96eWdvdXMgaGFwbG9pZCBnZW5vdHlwZXMgcHJlc2VudC4KCj4gUXVlc3Rpb246IENhbiB5b3UgdGhpbmsgb2ZmIHdoYXQgdGhlICcxMSw0NDAgaGV0ZXJvenlnb3VzIGhhcGxvaWQgZ2Vub3R5cGVzIHByZXNlbnQnIHJlcHJlc2VudD8gCgoKIyMgUXVhbGl0eSBjb250cm9sCgpXZSBhcmUgcmVhZHkgZm9yIHNvbWUgcXVhbGl0eSBjb250cm9sIGFuZCBxdWFsaXR5IGFzc3VyYW5jZSwgaGVhdmlseSBpbnNwaXJlZCBieSBBbmRlcnNvbiBfZXQgYWwuXyBbQGFuZGVyc29uMjAxMF0gYW5kIExhdXJpZSBfZXQgYWwuXyBbQGxhdXJpZTIwMTBdLiBJbiBnZW5lcmFsLCB3ZSBzaG91bGQgY2hlY2sgb3V0IGEgY291cGxlIG9mIHRoaW5ncyByZWdhcmRpbmcgdGhlIGRhdGEgcXVhbGl0eSBvbiB0d28gbGV2ZWxzOgoKMSkgc2FtcGxlcwoyKSB2YXJpYW50cwoKU28sIHdlIHdpbGwgaW52ZXN0aWdhdGUgdGhlIGZvbGxvd2luZzoKCi0gQXJlIHRoZSAqc2V4ZXMqIGJhc2VkIG9uIGdlbmV0aWMgZGF0YSBtYXRjaGluZyB0aGUgb25lcyBnaXZlbiBieSB0aGUgcGhlbm90eXBlIGZpbGU/Ci0gSWRlbnRpZnkgaW5kaXZpZHVhbHMgdGhhdCBhcmUgb3V0bGllcnMgaW4gdGVybXMgb2YgbWlzc2luZyBkYXRhIChfY2FsbCByYXRlXykgb3IgaGV0ZXJvenlnb3NpdHkgcmF0ZXMuIFRoaXMgY291bGQgaW5kaWNhdGUgYSBnZW5vdHlwaW5nIGVycm9yIG9yIHNhbXBsZSBzd2FwLgotIElkZW50aWZ5IGR1cGxpY2F0ZWQgb3IgcmVsYXRlZCBpbmRpdmlkdWFscy4KLSBJZGVudGlmeSBpbmRpdmlkdWFscyB3aXRoIGRpdmVyZ2VudCBhbmNlc3RyeS4KLSBXaGF0IGFyZSB0aGUgYWxsZWxlIGZyZXF1ZW5jaWVzPwotIFdoYXQgaXMgdGhlIHBlci1TTlAgY2FsbCByYXRlPwotIEluIHRoZSBjYXNlIG9mIGEgY2FzZS1jb250cm9sIHN0dWR5ICh3aGljaCBpcyB0aGUgY2FzZSBoZXJlKSwgd2UgbmVlZCB0byBjaGVjayBkaWZmZXJlbnRpYWwgbWlzc2luZ25lc3MgYmV0d2VlbiBjYXNlcyBhbmQgY29udHJvbHMuIAoKPiBRdWVzdGlvbjogQ2FuIHlvdSB0aGluayBvZiBvdGhlciBzY2VuYXJpb3MgaW4gd2hpY2ggeW91IG1heSB3YW50IHRvIGV4dGVuZCB0aGUgY2hlY2sgb24gZGlmZmVyZW50aWFsIG1pc3NpbmduZXNzIGJleW9uZCBhIGNoZWNrIGJldHdlZW4gY2FzZXMgYW5kIGNvbnRyb2xzPwoKCiMjIExldCdzIGdldCBvdXIgaGFuZHMgZGlydHkKCkFsbCBjbGVhcj8gTGV0J3Mgc3RhcnQgdGhlIHdvcmsuIE9uIHRvIHN0ZXAgMSBvZiB0aGUgUUMgZm9yIEdXQVM6IGZpbHRlciBzYW1wbGVzIG9mIHBvb3IgcXVhbGl0eSBpbiBDaGFwdGVyIFxAcmVmKGd3YXMtYmFzaWNzLXNhbXBsZS1xYykuCgo8IS0tIGBgYHtqcywgZWNobyA9IEZBTFNFfSAtLT4KPCEtLSB0aXRsZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhZGVyJyk7IC0tPgo8IS0tIHRpdGxlLmlubmVySFRNTCA9ICc8aW1nIHNyYz0iaW1nL19oZWFkZXJzL3dvbWFuX3dvcmtpbmdfb25fY29kZS5wbmciIGFsdD0iR1dBUyBiYXNpY3MiPicgKyB0aXRsZS5pbm5lckhUTUwgLS0+CjwhLS0gYGBgIC0tPgoKPCEtLWNoYXB0ZXI6ZW5kOjAzXzFfZ3dhc19iYXNpY3MuUm1kLS0+CgojIFNhbXBsZSBRQyB7I2d3YXMtYmFzaWNzLXNhbXBsZS1xY30KPCEtLSAhW10oLi9pbWcvX2d3YXNfZHVtbXkvZ3dhc19zYW1wbGVfcWMucG5nKXt3aWR0aD03MCV9IC0tPgoKCgoKCgpMZXQncyBzdGFydCB3aXRoIHRoZSBwZXItc2FtcGxlIHF1YWxpdHkgY29udHJvbC4gVGhlIGdvYWwgaGVyZSBpcyB0byBpZGVudGlmeSBhbGwgdGhlIHNhbXBsZXMgdGhhdCBmb3Igc29tZSByZWFzb24gKG1lbnRpb25lZCBpbiB0aGUgcHJldmlvdXMgc2VjdGlvbikgc2hvdWxkIGJlIGV4Y2x1ZGVkLiAKCiMjIFNleApXZSBuZWVkIHRvIGlkZW50aWZ5IG9mIGluZGl2aWR1YWxzIHdpdGggZGlzY29yZGFudCBzZXggaW5mb3JtYXRpb24gY29tcGFyaW5nIHBoZW5vdHlwaWMgYW5kIGdlbm90eXBpYyBkYXRhLiBMZXQncyBjYWxjdWxhdGUgdGhlIG1lYW4gaG9tb3p5Z29zaXR5IHJhdGUgYWNyb3NzIFgtY2hyb21vc29tZSBtYXJrZXJzIGZvciBlYWNoIGluZGl2aWR1YWwgaW4gdGhlIHN0dWR5LgoKYGBgCnBsaW5rIC0tYmZpbGUgZHVtbXlfcHJvamVjdC9yYXdkYXRhIC0tY2hlY2stc2V4IC0tb3V0IGR1bW15X3Byb2plY3QvcmF3ZGF0YQpgYGAKClRoaXMgcHJvZHVjZXMgYSBmaWxlIHdpdGggdGhlIGZvbGxvd2luZyBjb2x1bW5zOgoKLSBfRklEXwlGYW1pbHkgSUQKLSBfSUlEXwlXaXRoaW4tZmFtaWx5IElECi0gX1BFRFNFWF8JU2V4IGNvZGUgaW4gaW5wdXQgZmlsZQotIF9TTlBTRVhfCUltcHV0ZWQgc2V4IGNvZGUgKDEgPSBtYWxlLCAyID0gZmVtYWxlLCAwID0gdW5rbm93bikKLSBfU1RBVFVTXwknT0snIGlmIFBFRFNFWCBhbmQgU05QU0VYIG1hdGNoIGFuZCBhcmUgbm9uemVybywgJ1BST0JMRU0nIG90aGVyd2lzZQotIF9GXwlJbmJyZWVkaW5nIGNvZWZmaWNpZW50LCBjb25zaWRlcmluZyBvbmx5IFggY2hyb21vc29tZS4gTm90IHByZXNlbnQgd2l0aCAneS1vbmx5Jy4KLSBfWUNPVU5UXwlOdW1iZXIgb2Ygbm9ubWlzc2luZyBnZW5vdHlwZSBjYWxscyBvbiBZIGNocm9tb3NvbWUuIFJlcXVpcmVzICd5Y291bnQnLyd5LW9ubHknLgoKCldlIG5lZWQgdG8gZ2V0IGEgbGlzdCBvZiBpbmRpdmlkdWFscyB3aXRoIGRpc2NvcmRhbnQgc2V4IGRhdGEuCgpgYGAKY2F0IGR1bW15X3Byb2plY3QvcmF3ZGF0YS5zZXhjaGVjayB8IGF3ayAnJDUgPT0iU1RBVFVTIiB8fCAkNSA9PSJQUk9CTEVNIicgID4gZHVtbXlfcHJvamVjdC9yYXdkYXRhLnNleHByb2JzLnR4dApgYGAKCkxldCdzIGhhdmUgYSBsb29rIGF0IHRoZSByZXN1bHRzLgoKYGBgCmNhdCBkdW1teV9wcm9qZWN0L3Jhd2RhdGEuc2V4cHJvYnMudHh0CmBgYAoKCgoKCgpgYGB7PWh0bWx9CjxkaXYgY2xhc3M9InRhYndpZCI+PHN0eWxlPi5jbC04ZDcwNDA3NHt9LmNsLThkNjllNDA0e2ZvbnQtZmFtaWx5OidIZWx2ZXRpY2EnO2ZvbnQtc2l6ZToxMXB0O2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0eWxlOm5vcm1hbDt0ZXh0LWRlY29yYXRpb246bm9uZTtjb2xvcjpyZ2JhKDAsIDAsIDAsIDEuMDApO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7fS5jbC04ZDZjNGNlZXttYXJnaW46MDt0ZXh0LWFsaWduOnJpZ2h0O2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtwYWRkaW5nLWJvdHRvbTo1cHQ7cGFkZGluZy10b3A6NXB0O3BhZGRpbmctbGVmdDo1cHQ7cGFkZGluZy1yaWdodDo1cHQ7bGluZS1oZWlnaHQ6IDE7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt9LmNsLThkNmM0Y2Y4e21hcmdpbjowO3RleHQtYWxpZ246bGVmdDtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7cGFkZGluZy1ib3R0b206NXB0O3BhZGRpbmctdG9wOjVwdDtwYWRkaW5nLWxlZnQ6NXB0O3BhZGRpbmctcmlnaHQ6NXB0O2xpbmUtaGVpZ2h0OiAxO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7fS5jbC04ZDZjNWVhYXt3aWR0aDowLjU2OGluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAxLjVwdCBzb2xpZCByZ2JhKDEwMiwgMTAyLCAxMDIsIDEuMDApO2JvcmRlci10b3A6IDEuNXB0IHNvbGlkIHJnYmEoMTAyLCAxMDIsIDEwMiwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZDZjNWViNHt3aWR0aDowLjgwNWluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAxLjVwdCBzb2xpZCByZ2JhKDEwMiwgMTAyLCAxMDIsIDEuMDApO2JvcmRlci10b3A6IDEuNXB0IHNvbGlkIHJnYmEoMTAyLCAxMDIsIDEwMiwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZDZjNWViNXt3aWR0aDowLjkzMmluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAxLjVwdCBzb2xpZCByZ2JhKDEwMiwgMTAyLCAxMDIsIDEuMDApO2JvcmRlci10b3A6IDEuNXB0IHNvbGlkIHJnYmEoMTAyLCAxMDIsIDEwMiwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZDZjNWViNnt3aWR0aDowLjY1MmluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAxLjVwdCBzb2xpZCByZ2JhKDEwMiwgMTAyLCAxMDIsIDEuMDApO2JvcmRlci10b3A6IDEuNXB0IHNvbGlkIHJnYmEoMTAyLCAxMDIsIDEwMiwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZDZjNWViZXt3aWR0aDowLjU2OGluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGQ2YzVlYmZ7d2lkdGg6MC44MDVpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkNmM1ZWM4e3dpZHRoOjAuOTMyaW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZDZjNWVjOXt3aWR0aDowLjY1MmluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGQ2YzVlY2F7d2lkdGg6MC41NjhpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMS41cHQgc29saWQgcmdiYSgxMDIsIDEwMiwgMTAyLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZDZjNWVkMnt3aWR0aDowLjgwNWluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAxLjVwdCBzb2xpZCByZ2JhKDEwMiwgMTAyLCAxMDIsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkNmM1ZWQze3dpZHRoOjAuOTMyaW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDEuNXB0IHNvbGlkIHJnYmEoMTAyLCAxMDIsIDEwMiwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGQ2YzVlZGN7d2lkdGg6MC42NTJpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMS41cHQgc29saWQgcmdiYSgxMDIsIDEwMiwgMTAyLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fTwvc3R5bGU+PHRhYmxlIGRhdGEtcXVhcnRvLWRpc2FibGUtcHJvY2Vzc2luZz0ndHJ1ZScgY2xhc3M9J2NsLThkNzA0MDc0Jz4KCmBgYAoKPGNhcHRpb24gc3R5bGU9ImRpc3BsYXk6dGFibGUtY2FwdGlvbjsiPihcI3RhYjpzZXhpc3N1ZXMpPHNwYW4+U2V4IGlzc3Vlcy48L3NwYW4+PC9jYXB0aW9uPgoKYGBgez1odG1sfQoKPHRoZWFkPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRoIGNsYXNzPSJjbC04ZDZjNWVhYSI+PHAgY2xhc3M9ImNsLThkNmM0Y2VlIj48c3BhbiBjbGFzcz0iY2wtOGQ2OWU0MDQiPkZJRDwvc3Bhbj48L3A+PC90aD48dGggY2xhc3M9ImNsLThkNmM1ZWFhIj48cCBjbGFzcz0iY2wtOGQ2YzRjZWUiPjxzcGFuIGNsYXNzPSJjbC04ZDY5ZTQwNCI+SUlEPC9zcGFuPjwvcD48L3RoPjx0aCBjbGFzcz0iY2wtOGQ2YzVlYjQiPjxwIGNsYXNzPSJjbC04ZDZjNGNlZSI+PHNwYW4gY2xhc3M9ImNsLThkNjllNDA0Ij5QRURTRVg8L3NwYW4+PC9wPjwvdGg+PHRoIGNsYXNzPSJjbC04ZDZjNWViNCI+PHAgY2xhc3M9ImNsLThkNmM0Y2VlIj48c3BhbiBjbGFzcz0iY2wtOGQ2OWU0MDQiPlNOUFNFWDwvc3Bhbj48L3A+PC90aD48dGggY2xhc3M9ImNsLThkNmM1ZWI1Ij48cCBjbGFzcz0iY2wtOGQ2YzRjZjgiPjxzcGFuIGNsYXNzPSJjbC04ZDY5ZTQwNCI+U1RBVFVTPC9zcGFuPjwvcD48L3RoPjx0aCBjbGFzcz0iY2wtOGQ2YzVlYjYiPjxwIGNsYXNzPSJjbC04ZDZjNGNlZSI+PHNwYW4gY2xhc3M9ImNsLThkNjllNDA0Ij5GPC9zcGFuPjwvcD48L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+PHRyIHN0eWxlPSJvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmQ7Ij48dGQgY2xhc3M9ImNsLThkNmM1ZWJlIj48cCBjbGFzcz0iY2wtOGQ2YzRjZWUiPjxzcGFuIGNsYXNzPSJjbC04ZDY5ZTQwNCI+NzcyPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ2YzVlYmUiPjxwIGNsYXNzPSJjbC04ZDZjNGNlZSI+PHNwYW4gY2xhc3M9ImNsLThkNjllNDA0Ij43NzI8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZDZjNWViZiI+PHAgY2xhc3M9ImNsLThkNmM0Y2VlIj48c3BhbiBjbGFzcz0iY2wtOGQ2OWU0MDQiPjI8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZDZjNWViZiI+PHAgY2xhc3M9ImNsLThkNmM0Y2VlIj48c3BhbiBjbGFzcz0iY2wtOGQ2OWU0MDQiPjA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZDZjNWVjOCI+PHAgY2xhc3M9ImNsLThkNmM0Y2Y4Ij48c3BhbiBjbGFzcz0iY2wtOGQ2OWU0MDQiPlBST0JMRU08L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZDZjNWVjOSI+PHAgY2xhc3M9ImNsLThkNmM0Y2VlIj48c3BhbiBjbGFzcz0iY2wtOGQ2OWU0MDQiPjAuMzA4NDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDZjNWViZSI+PHAgY2xhc3M9ImNsLThkNmM0Y2VlIj48c3BhbiBjbGFzcz0iY2wtOGQ2OWU0MDQiPjg1Mzwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkNmM1ZWJlIj48cCBjbGFzcz0iY2wtOGQ2YzRjZWUiPjxzcGFuIGNsYXNzPSJjbC04ZDY5ZTQwNCI+ODUzPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ2YzVlYmYiPjxwIGNsYXNzPSJjbC04ZDZjNGNlZSI+PHNwYW4gY2xhc3M9ImNsLThkNjllNDA0Ij4yPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ2YzVlYmYiPjxwIGNsYXNzPSJjbC04ZDZjNGNlZSI+PHNwYW4gY2xhc3M9ImNsLThkNjllNDA0Ij4wPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ2YzVlYzgiPjxwIGNsYXNzPSJjbC04ZDZjNGNmOCI+PHNwYW4gY2xhc3M9ImNsLThkNjllNDA0Ij5QUk9CTEVNPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ2YzVlYzkiPjxwIGNsYXNzPSJjbC04ZDZjNGNlZSI+PHNwYW4gY2xhc3M9ImNsLThkNjllNDA0Ij4wLjM2NjY8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgc3R5bGU9Im92ZXJmbG93LXdyYXA6YnJlYWstd29yZDsiPjx0ZCBjbGFzcz0iY2wtOGQ2YzVlY2EiPjxwIGNsYXNzPSJjbC04ZDZjNGNlZSI+PHNwYW4gY2xhc3M9ImNsLThkNjllNDA0Ij4xLDkyMDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkNmM1ZWNhIj48cCBjbGFzcz0iY2wtOGQ2YzRjZWUiPjxzcGFuIGNsYXNzPSJjbC04ZDY5ZTQwNCI+MSw5MjA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZDZjNWVkMiI+PHAgY2xhc3M9ImNsLThkNmM0Y2VlIj48c3BhbiBjbGFzcz0iY2wtOGQ2OWU0MDQiPjI8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZDZjNWVkMiI+PHAgY2xhc3M9ImNsLThkNmM0Y2VlIj48c3BhbiBjbGFzcz0iY2wtOGQ2OWU0MDQiPjA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZDZjNWVkMyI+PHAgY2xhc3M9ImNsLThkNmM0Y2Y4Ij48c3BhbiBjbGFzcz0iY2wtOGQ2OWU0MDQiPlBST0JMRU08L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZDZjNWVkYyI+PHAgY2xhc3M9ImNsLThkNmM0Y2VlIj48c3BhbiBjbGFzcz0iY2wtOGQ2OWU0MDQiPjAuNDA2Njwvc3Bhbj48L3A+PC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj4KYGBgCgoKV2hlbiB0aGUgaG9tb3p5Z29zaXR5IHJhdGUgKF9GXykgaXMgbW9yZSB0aGFuIDAuMiwgYnV0IGxlc3MgdGhhbiAwLjgsIHRoZSBnZW5vdHlwZSBkYXRhIGFyZSBpbmNvbmNsdXNpdmUgcmVnYXJkaW5nIHRoZSBzZXggb2YgYW4gaW5kaXZpZHVhbCBhbmQgdGhlc2UgYXJlIG1hcmtlZCBpbiBjb2x1bW4gX1NOUFNFWF8gd2l0aCBhIDAsIGFuZCB0aGUgY29sdW1uIF9TVEFUVVNfICJQUk9CTEVNIi4KClJlcG9ydCB0aGUgSURzIG9mIGluZGl2aWR1YWxzIHdpdGggZGlzY29yZGFudCBzZXggaW5mb3JtYXRpb24gKFRhYmxlIFxAcmVmKHRhYjpzZXhpc3N1ZXMpKSB0byB0aG9zZSB3aG8gY29uZHVjdGVkIHNleCBwaGVub3R5cGluZy4gSW4gc2l0dWF0aW9ucyBpbiB3aGljaCBkaXNjcmVwYW5jeSBjYW5ub3QgYmUgcmVzb2x2ZWQsIGFkZCB0aGUgZmFtaWx5IElEIChGSUQpIGFuZCBpbmRpdmlkdWFsIElEIChJSUQpIG9mIHRoZSBzYW1wbGVzIHRvIGEgZmlsZSBuYW1lZCBgZmFpbC1zZXhjaGVjay1xYy50eHRgIChvbmUgaW5kaXZpZHVhbCBwZXIgbGluZSwgdGFiIGRlbGltaXRlZCkuCgpgYGAKZ3JlcCAiUFJPQkxFTSIgZHVtbXlfcHJvamVjdC9yYXdkYXRhLnNleGNoZWNrIHwgYXdrICd7IHByaW50ICQxLCAkMn0nICA+IGR1bW15X3Byb2plY3QvZmFpbC1zZXhjaGVjay1xYy50eHQKYGBgCgojIyBTYW1wbGUgY2FsbCByYXRlcwpMZXQncyBnZXQgYW4gb3ZlcnZpZXcgb2YgdGhlIG1pc3NpbmcgZGF0YSBwZXIgc2FtcGxlIGFuZCBwZXIgU05QLgoKYGBgCnBsaW5rIC0tYmZpbGUgZHVtbXlfcHJvamVjdC9yYXdkYXRhIC0tbWlzc2luZyAtLW91dCBkdW1teV9wcm9qZWN0L3Jhd2RhdGEKYGBgCgpUaGlzIHByb2R1Y2VzIHR3byBmaWxlcywgYHJhd2RhdGEvcmF3ZGF0YS5pbWlzc2AgYW5kIGByYXdkYXRhL3Jhd2RhdGEubG1pc3NgLiBJbiB0aGUgYC5pbWlzc2AtZmlsZSB0aGUgX05fTUlTU18gY29sdW1uIGRlbm90ZXMgdGhlIG51bWJlciBvZiBtaXNzaW5nIFNOUHMsIGFuZCB0aGUgX0ZfTUlTU18gY29sdW1uIGRlbm90ZXMgdGhlIHByb3BvcnRpb24gb2YgbWlzc2luZyBTTlBzIHBlciBpbmRpdmlkdWFsLgoKCgoKCgpUaGUgZ3JleSBkYXNoZWQgbGluZSBpbiBGaWd1cmUgXEByZWYoZmlnOnNob3dzYW1wbGVjYWxscmF0ZSkgaW5kaWNhdGVzIHRoZSBtZWFuIGNhbGwgcmF0ZSwgd2hpbGUgdGhlIHJlZCBkYXNoZWQgbGluZSBpbmRpY2F0ZXMgdGhlIHRocmVzaG9sZCB3ZSBoYWQgZGV0ZXJtaW5lZCBhYm92ZS4KCjxkaXYgY2xhc3M9ImZpZ3VyZSIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+CjxpbWcgc3JjPSJpbWcvX2d3YXNfZHVtbXkvZ3dhcy1xYy1zYW1wbGUtY2FsbHJhdGUucG5nIiBhbHQ9IlBlciBzYW1wbGUgY2FsbCByYXRlLiIgd2lkdGg9Ijg1JSIgLz4KPHAgY2xhc3M9ImNhcHRpb24iPihcI2ZpZzpzaG93c2FtcGxlY2FsbHJhdGUpUGVyIHNhbXBsZSBjYWxsIHJhdGUuPC9wPgo8L2Rpdj4KCgojIyBIZXRlcm96eWdvc2l0eSByYXRlCgpUbyBwcm9wZXJseSBjYWxjdWxhdGUgaGV0ZXJvenlnb3NpdHkgcmF0ZSBhbmQgcmVsYXRlZG5lc3MgKGlkZW50aXR5LWJ5LWRlc2NlbnQgW0lCRF0pIHdlIG5lZWQgdG8gZG8gZm91ciB0aGluZ3M6CgoxKSBwcmUtY2xlYW4gdGhlIGRhdGEgdG8gZ2V0IGEgaGlnaC1xdWFsaXR5IHNldCwKMikgb2YgaW5kZXBlbmRlbnQgU05QcywKMykgZXhjbHVkZSBsb25nLXJhbmdlIGxpbmthZ2UgZGlzZXF1aWxpYnJpdW0gKExEKSBibG9ja3MgdGhhdCBiaWFzIHdpdGggdGhlc2UgY2FsY3VsYXRpb25zLCBhbmQKNCkgZXhjbHVkZSBBL1QgYW5kIEMvRyBTTlBzIGFzIHRoZXNlIG1heSBiZSBhbWJpdmFsZW50IGluIGludGVycHJldGF0aW9uIHdoZW4gZnJlcXVlbmNpZXMgYmV0d2VlbiBjYXNlcyBhbmQgY29udHJvbHMgYXJlIGNsb3NlIChNQUYgwrEgMC40NSksCjUpIHJlbW92ZSBhbGwgbm9uLWF1dG9zb21hbCBTTlBzLgoKWW91IGNhbiBmaW5kIGFuIHVwLXRvLWRhdGUgbGlzdCBvZiBMRCBibG9ja3MgeW91IHNob3VsZCBleGNsdWRlIGluIHRoZXNlIHR5cGVzIG9mIGFuYWx5c2VzIFtoZXJlXShodHRwczovL2dlbm9tZS5zcGgudW1pY2guZWR1L3dpa2kvUmVnaW9uc19vZl9oaWdoX2xpbmthZ2VfZGlzZXF1aWxpYnJpdW1fKExEKSl7dGFyZ2V0PSJfYmxhbmsifSBmb3IgdGhlIGRpZmZlcmVudCBnZW5vbWUgYnVpbGRzLiBJbiB0aGlzIGNhc2Ugd2UgYXJlIHVzaW5nIGJ1aWxkIDM3LiBGb3IgdGhlIHB1cnBvc2Ugb2YgdGhpcyBib29rIHdlIGluY2x1ZGVkIGEgZmlsZSB3aXRoIHRoZXNlIHJlZ2lvbnMgaW4gdGhlIGBzdXBwb3J0YC1kaXJlY3RvcnkuCgpXZSB3aWxsIHVzZSB0aGUgZm9sbG93aW5nIHNldHRpbmdzOgoKLSByZW1vdmUgQS9UIGFuZCBDL0cgU05QcyB3aXRoIHRoZSBmbGFnIGAtLWV4Y2x1ZGUgZHVtbXlfcHJvamVjdC9hbGwuYXRjZy52YXJpYW50cy50eHRgLAotIGNhbGwgcmF0ZSA8MSUgd2l0aCB0aGUgZmxhZyBgLS1nZW5vIDAuMTBgLAotIEhhcmR5LVdlaW5iZXJnIEVxdWlsaWJyaXVtIChIV0UpIHAtdmFsdWUgPiAxeDEwLTMgd2l0aCB0aGUgZmxhZyBgLS1od2UgMWUtM2AsCi0gYW5kIE1BRj4xMCUgd2l0aCB0aGUgZmxhZyBgLS1tYWYgMC4xMCBgLAotIHBydW5lIHRoZSBkYXRhIHRvIG9ubHkgc2VsZWN0IGluZGVwZW5kZW50IFNOUHMgKHdpdGggbG93IExEIHJeMikgb2Ygb25lIHBhaXIgZWFjaCB3aXRoIGByXjIgPSAwLjJgIHdpdGggdGhlIGZsYWdzIGAtLWluZGVwLXBhaXJ3aXNlIDEwMCAxMCAwLjJgIGFuZCBgLS1leHRyYWN0IHJhd2RhdGEvcmF3LUdXQS1kYXRhLnBydW5lLmluYCwKLSBTTlBzIGluIGxvbmctcmFuZ2UgTEQgcmVnaW9ucyAoZm9yIGV4YW1wbGU6IE1IQyBjaHIgNiAyNS44LTM2TWIsIGNociA4IGludmVyc2lvbiA2LTE2TWIsIGNocjE3IDQwLTQ1TWIsIGFuZCBhIGZldyBtb3JlKSB3aXRoIHRoZSBmbGFnIGAtLWV4Y2x1ZGUgcmFuZ2Ugc3VwcG9ydC9leGNsdWRlX3Byb2JsZW1hdGljX3JhbmdlLnR4dGAsCi0gcmVtb3ZlIG5vbi1hdXRvc29tYWwgU05QcyB3aXRoIHRoZSBmbGFnIGAtLWF1dG9zb21lYC4KCkZpcnN0LCBnZXQgYSBsaXN0IG9mIEEvVCBhbmQgQy9HIFNOUHMuIFJlbWVtYmVyLCB0aGUgbGlzdCBvZiBtYXJrZXJzIGZvciB0aGlzIEdXQVMgaXMgbm90ZWQgaW4gdGhlIGAuYmltYCBmaWxlLiBXZSBjYW4gc2ltcGx5IGdyZXAgYWxsIHRoZSBsaW5lcyB3aGVyZSB0aGUgdHdvIGFsbGVsZXMgZWl0aGVyIGhhdmUgYW4gQS9UIG9yIEMvRyBjb21iaW5hdGlvbi4KCmBgYApjYXQgZHVtbXlfcHJvamVjdC9yYXdkYXRhLmJpbSB8IFwKYXdrICcoJDUgPT0gIkEiICYmICQ2ID09ICJUIikgfHwgKCQ1ID09ICJUIiAmJiAkNiA9PSAiQSIpIHx8ICgkNSA9PSAiQyIgJiYgJDYgPT0gIkciKSB8fCAoJDUgPT0gIkciICYmICQ2ID09ICJDIiknIHwgYXdrICd7IHByaW50ICQyLCAkMSwgJDQsICQzLCAkNSwgJDYgfScgXAo+IGR1bW15X3Byb2plY3QvYWxsLmF0Y2cudmFyaWFudHMudHh0CmBgYAoKU2Vjb25kLCBjbGVhbiB0aGUgZGF0YSBhbmQgZ2V0IGEgbGlzdCBvZiBpbmRlcGVuZGVudCBTTlBzLgoKPCEtLSAqTkVYVCBZRUFSOiBmdXJ0aGVyIGV4cGxhaW4gdGhlIGV4YWN0IGNvbW1hbmRzICBhbmQgaG93IHRoZXkgcmVsYXRlIHdpdGggdGhlIGFib3ZlLiBJcyB0aGlzIG5lZWRlZD8gKiAtLT4KCmBgYApwbGluayAtLWJmaWxlIGR1bW15X3Byb2plY3QvcmF3ZGF0YSBcCi0tYXV0b3NvbWUgXAotLW1hZiAwLjEwIC0tZ2VubyAwLjEwIC0taHdlIDFlLTMgXAotLWluZGVwLXBhaXJ3aXNlIDEwMCAxMCAwLjIgXAotLWV4Y2x1ZGUgcmFuZ2Ugc3VwcG9ydC9leGNsdWRlX3Byb2JsZW1hdGljX3JhbmdlLnR4dCBcCi0tbWFrZS1iZWQgLS1vdXQgZHVtbXlfcHJvamVjdC9yYXdkYXRhLmNsZWFuLnRlbXAKYGBgCgo+IFBsZWFzZSBub3RlLCB3ZSBoYXZlIGNyZWF0ZSBhIGRhdGFzZXQgd2l0aG91dCB0YWtpbmcgaW50byBhY2NvdW50IExEIHN0cnVjdHVyZS4gSGVuY2UsIHRoZSBtZXNzYWdlICdQcnVuZWQgMCB2YXJpYW50cyBmcm9tIGNocm9tb3NvbWUgMSwgbGVhdmluZyAxOTQyMC4nIGV0Yy4gSW4gYSBkYXRhc2V0IHdpdGhvdXQgYW55IExEIHN0cnVjdHVyZSB0aGlzIGZsYWcgYC0taW5kZXAtcGFpcndpc2UgMTAwIDEwIDAuMmAgZG9lc24ndCBhY3R1YWxseSB3b3JrLiBIb3dldmVyLCB3aXRoIHJlYWwtZGF0YSB5b3UgY2FuIHVzZSBpdCB0byBwcnVuZSBvdXQgdW53YW50ZWQgU05QcyBpbiBoaWdoIExELgoKVGhpcmQsIGV4Y2x1ZGUgdGhlIHBydW5lZCBTTlBzLiBOb3RlLCBob3cgd2UgaW5jbHVkZSBhIGZpbGUgdG8gZXhjbHVkZSBoaWdoLUxEIGZvciB0aGUgcHVycG9zZSBvZiB0aGUgcHJhY3RpY2FsLgoKYGBgCnBsaW5rIC0tYmZpbGUgZHVtbXlfcHJvamVjdC9yYXdkYXRhLmNsZWFuLnRlbXAgXAotLWV4dHJhY3QgcmF3ZGF0YS9yYXctR1dBLWRhdGEucHJ1bmUuaW4gXAotLW1ha2UtYmVkIC0tb3V0IGR1bW15X3Byb2plY3QvcmF3ZGF0YS5jbGVhbi51bHRyYWNsZWFuLnRlbXAKYGBgCgpGb3VydGgsIHJlbW92ZSB0aGUgQS9UIGFuZCBDL0cgU05Qcy4KCmBgYApwbGluayAtLWJmaWxlIGR1bW15X3Byb2plY3QvcmF3ZGF0YS5jbGVhbi51bHRyYWNsZWFuLnRlbXAgXAotLWV4Y2x1ZGUgZHVtbXlfcHJvamVjdC9hbGwuYXRjZy52YXJpYW50cy50eHQgXAotLW1ha2UtYmVkIC0tb3V0IGR1bW15X3Byb2plY3QvcmF3ZGF0YS5jbGVhbi51bHRyYWNsZWFuCmBgYAoKPiBQbGVhc2Ugbm90ZSwgdGhpcyBkYXRhc2V0IGRvZXNuJ3QgYWN0dWFsbHkgaW5jbHVkZSB0aGlzIHR5cGUgb2YgU05QLCBoZW5jZSBgcmF3ZGF0YS9hbGwuYXRjZy52YXJpYW50cy50eHRgIGlzIGVtcHR5ISBBZ2FpbiwgeW91IGNhbiB1c2UgdGhpcyBjb21tYW5kIGluIHJlYWwtZGF0YSB0byBleGNsdWRlIEEvVCBhbmQgQy9HIFNOUHMuCgpMYXN0bHksIHJlbW92ZSB0aGUgdGVtcG9yYXJ5IGZpbGVzLgoKYGBgCnJtIC1mdiBkdW1teV9wcm9qZWN0LyoudGVtcCoKYGBgCgpGaW5hbGx5LCB3ZSBjYW4gY2FsY3VsYXRlIHRoZSBoZXRlcm96eWdvc2l0eSByYXRlLgoKYGBgCnBsaW5rIC0tYmZpbGUgZHVtbXlfcHJvamVjdC9yYXdkYXRhLmNsZWFuLnVsdHJhY2xlYW4gLS1oZXQgLS1vdXQgZHVtbXlfcHJvamVjdC9yYXdkYXRhLmNsZWFuLnVsdHJhY2xlYW4KYGBgCgpUaGlzIGNyZWF0ZXMgdGhlIGZpbGUgYGR1bW15X3Byb2plY3QvcmF3ZGF0YS5jbGVhbi51bHRyYWNsZWFuLmhldGAsIGluIHdoaWNoIHRoZSB0aGlyZCBjb2x1bW4gZGVub3RlcyB0aGUgb2JzZXJ2ZWQgbnVtYmVyIG9mIGhvbW96eWdvdXMgZ2Vub3R5cGVzLCBPKEhvbSksIGFuZCB0aGUgZmlmdGggY29sdW1uIGRlbm90ZXMgdGhlIG51bWJlciBvZiBub25taXNzaW5nIGdlbm90eXBlcywgTihOTSksIHBlciBpbmRpdmlkdWFsLiBXZSBjYW4gbm93IGNhbGN1bGF0ZSB0aGUgb2JzZXJ2ZWQgaGV0ZXJvenlnb3NpdHkgcmF0ZSBwZXIgaW5kaXZpZHVhbCB1c2luZyB0aGUgZm9ybXVsYSAoTihOTSkgLSBPKEhvbSkpL04oTk0pLgoKT2Z0ZW4gdGhlcmUgaXMgYSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGhldGVyb3p5Z29zaXR5IHJhdGUgYW5kIG1pc3NpbmcgZGF0YS4gVGh1cywgd2Ugc2hvdWxkIHBsb3QgdGhlIG9ic2VydmVkIGhldGVyb3p5Z29zaXR5IHJhdGUgcGVyIGluZGl2aWR1YWwgb24gdGhlIHgtYXhpcyBhbmQgdGhlIHByb3BvcnRpb24gb2YgbWlzc2luZyBTTlAsIHRoYXQgaXMgdGhlICdTTlAgY2FsbCByYXRlJywgcGVyIGluZGl2aWR1YWxzIG9uIHRoZSB5LWF4aXMgKEZpZ3VyZSBcQHJlZihmaWc6c2hvd2hldGVyb3p5Z29zaXR5KSkuCgoKCgoKCjwhLS0gSSBwcmVmZXIgdG8gdXNlIGdncHViciwgYnV0IEkgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgdGhpcyBjb2RlIGRvZXNuJ3Qgd29yayBhbnltb3JlLi4uPyE/ISAtLT4KPCEtLSBgYGB7ciBoZXRlcm96eWdvc2l0eSwgZXZhbCA9IEZBTFNFfSAtLT4KPCEtLSBnZ3B1YnI6Omdnc2NhdHRlcihyYXdfSU1JU1NIRVQsIHggPSAibG9nRl9NSVNTIiwgeSA9ICJtZWFuSGV0IiwgLS0+CjwhLS0gICAgICAgICAgICAgICAgICAgY29sb3JzID0gY29sb3JzLCAtLT4KPCEtLSAgICAgICAgICAgICAgICAgICB4bGFiID0gIlByb3BvcnRpb24gb2YgbWlzc2luZyBnZW5vdHlwZXMiLCB5bGFiID0gIkhldGVyb3p5Z29zaXR5IHJhdGUiKSArIC0tPgo8IS0tICAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscz1jKCItMyIgPSAiMC4wMDEiLCAiLTIiID0gIjAuMDEiLCAtLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLTEiID0gIjAuMSIsICIwIiA9ICIxIikpICsgLS0+CjwhLS0gICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBsb3dlcl9tZWFuSGV0LCBsaW5ldHlwZSA9ICJkYXNoZWQiLCAtLT4KPCEtLSAgICAgICAgICAgICAgICAgY29sb3IgPSAiI0U1NTczOCIsIHNpemUgPSAxKSArIC0tPgo8IS0tICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gdXBwZXJfbWVhbkhldCwgbGluZXR5cGUgPSAiZGFzaGVkIiwgLS0+CjwhLS0gICAgICAgICAgICAgICAgIGNvbG9yID0gIiNFNTU3MzgiLCBzaXplID0gMSkgKyAtLT4KPCEtLSAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IHByb3BfbWlzcywgbGluZXR5cGUgPSAiZGFzaGVkIiwgLS0+CjwhLS0gICAgICAgICAgICAgICAgIGNvbG9yID0gIiNFNTU3MzgiLCBzaXplID0gMSkgLS0+CjwhLS0gYGBgIC0tPgoKPGRpdiBjbGFzcz0iZmlndXJlIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj4KPGltZyBzcmM9ImltZy9fZ3dhc19kdW1teS9zaG93LWhldGVyb3p5Z29zaXR5LnBuZyIgYWx0PSJIZXRlcm96eWdvc2l0eSBhcyBhIGZ1bmN0aW9uIG9mIFNOUCBjYWxsIHJhdGUuIiB3aWR0aD0iODUlIiAvPgo8cCBjbGFzcz0iY2FwdGlvbiI+KFwjZmlnOnNob3doZXRlcm96eWdvc2l0eSlIZXRlcm96eWdvc2l0eSBhcyBhIGZ1bmN0aW9uIG9mIFNOUCBjYWxsIHJhdGUuPC9wPgo8L2Rpdj4KCkV4YW1pbmUgdGhlIHBsb3QgKEZpZ3VyZSBcQHJlZihmaWc6c2hvd2hldGVyb3p5Z29zaXR5KSkgdG8gZGVjaWRlIHJlYXNvbmFibGUgdGhyZXNob2xkcyBhdCB3aGljaCB0byBleGNsdWRlIGluZGl2aWR1YWxzIGJhc2VkIG9uIGVsZXZhdGVkIG1pc3Npbmcgb3IgZXh0cmVtZSBoZXRlcm96eWdvc2l0eS4gV2UgY2hvc2UgdG8gZXhjbHVkZSBhbGwgaW5kaXZpZHVhbHMgd2l0aCBhIGdlbm90eXBlIGZhaWx1cmUgcmF0ZSA+PSAwLjAzICh2ZXJ0aWNhbCBkYXNoZWQgbGluZSkgYW5kL29yIGEgaGV0ZXJvenlnb3NpdHkgcmF0ZSDCsSAzIHMuZC4gZnJvbSB0aGUgbWVhbiAoaG9yaXpvbnRhbCBkYXNoZWQgbGluZXMpLiBBZGQgdGhlIEZJRCBhbmQgSUlEIG9mIHRoZSBzYW1wbGVzIGZhaWxpbmcgdGhpcyBRQyB0byB0aGUgZmlsZSBuYW1lZCBgZmFpbC1pbWlzc2hldC1xYy50eHRgLgoKPiBIb3cgd291bGQgeW91IGNyZWF0ZSB0aGlzIGZpbGU/CgoKCklmIGFsbCBpcyByaWdodCwgeW91J2QgaGF2ZSBzb21ldGhpbmcgbGlrZSBUYWJsZSBcQHJlZih0YWI6ZmFpbGVkY2FsbHJhdGVoZXQpLgoKCgoKYGBgez1odG1sfQo8ZGl2IGNsYXNzPSJ0YWJ3aWQiPjxzdHlsZT4uY2wtOGQ5MDdlYTJ7fS5jbC04ZDg4MDNhOHtmb250LWZhbWlseTonSGVsdmV0aWNhJztmb250LXNpemU6MTFwdDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHlsZTpub3JtYWw7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y29sb3I6cmdiYSgwLCAwLCAwLCAxLjAwKTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O30uY2wtOGQ4YTQ2Y2N7bWFyZ2luOjA7dGV4dC1hbGlnbjpyaWdodDtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7cGFkZGluZy1ib3R0b206NXB0O3BhZGRpbmctdG9wOjVwdDtwYWRkaW5nLWxlZnQ6NXB0O3BhZGRpbmctcmlnaHQ6NXB0O2xpbmUtaGVpZ2h0OiAxO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7fS5jbC04ZDhhNTRmMHt3aWR0aDowLjU2OGluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAxLjVwdCBzb2xpZCByZ2JhKDEwMiwgMTAyLCAxMDIsIDEuMDApO2JvcmRlci10b3A6IDEuNXB0IHNvbGlkIHJnYmEoMTAyLCAxMDIsIDEwMiwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZDhhNTRmMXt3aWR0aDowLjU2OGluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGQ4YTU0ZmF7d2lkdGg6MC41NjhpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkOGE1NGZie3dpZHRoOjAuNTY4aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZDhhNTUwNHt3aWR0aDowLjU2OGluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGQ4YTU1MDV7d2lkdGg6MC41NjhpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkOGE1NTBle3dpZHRoOjAuNTY4aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZDhhNTUwZnt3aWR0aDowLjU2OGluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGQ4YTU1MTB7d2lkdGg6MC41NjhpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkOGE1NTE4e3dpZHRoOjAuNTY4aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZDhhNTUyMnt3aWR0aDowLjU2OGluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGQ4YTU1MjN7d2lkdGg6MC41NjhpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkOGE1NTJje3dpZHRoOjAuNTY4aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZDhhNTUyZHt3aWR0aDowLjU2OGluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGQ4YTU1MmV7d2lkdGg6MC41NjhpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkOGE1NTM2e3dpZHRoOjAuNTY4aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDEuNXB0IHNvbGlkIHJnYmEoMTAyLCAxMDIsIDEwMiwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO308L3N0eWxlPjx0YWJsZSBkYXRhLXF1YXJ0by1kaXNhYmxlLXByb2Nlc3Npbmc9J3RydWUnIGNsYXNzPSdjbC04ZDkwN2VhMic+CgpgYGAKCjxjYXB0aW9uIHN0eWxlPSJkaXNwbGF5OnRhYmxlLWNhcHRpb247Ij4oXCN0YWI6ZmFpbGVkY2FsbHJhdGVoZXQpPHNwYW4+RmFpbGVkIHNhbXBsZXMgZHVlIHRvIHNhbXBsZSBjYWxsIHJhdGVzIGFuZCBoZXRlcm96eWdvc2l0eSByYXRlLjwvc3Bhbj48L2NhcHRpb24+CgpgYGB7PWh0bWx9Cgo8dGhlYWQ+PHRyIHN0eWxlPSJvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmQ7Ij48dGggY2xhc3M9ImNsLThkOGE1NGYwIj48cCBjbGFzcz0iY2wtOGQ4YTQ2Y2MiPjxzcGFuIGNsYXNzPSJjbC04ZDg4MDNhOCI+RklEPC9zcGFuPjwvcD48L3RoPjx0aCBjbGFzcz0iY2wtOGQ4YTU0ZjAiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij5JSUQ8L3NwYW4+PC9wPjwvdGg+PC90cj48L3RoZWFkPjx0Ym9keT48dHIgc3R5bGU9Im92ZXJmbG93LXdyYXA6YnJlYWstd29yZDsiPjx0ZCBjbGFzcz0iY2wtOGQ4YTU0ZjEiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4yODwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkOGE1NGYxIj48cCBjbGFzcz0iY2wtOGQ4YTQ2Y2MiPjxzcGFuIGNsYXNzPSJjbC04ZDg4MDNhOCI+Mjg8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgc3R5bGU9Im92ZXJmbG93LXdyYXA6YnJlYWstd29yZDsiPjx0ZCBjbGFzcz0iY2wtOGQ4YTU0ZmEiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij41MDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkOGE1NGZhIj48cCBjbGFzcz0iY2wtOGQ4YTQ2Y2MiPjxzcGFuIGNsYXNzPSJjbC04ZDg4MDNhOCI+NTA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgc3R5bGU9Im92ZXJmbG93LXdyYXA6YnJlYWstd29yZDsiPjx0ZCBjbGFzcz0iY2wtOGQ4YTU0ZmIiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij41Mjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkOGE1NGZiIj48cCBjbGFzcz0iY2wtOGQ4YTQ2Y2MiPjxzcGFuIGNsYXNzPSJjbC04ZDg4MDNhOCI+NTI8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgc3R5bGU9Im92ZXJmbG93LXdyYXA6YnJlYWstd29yZDsiPjx0ZCBjbGFzcz0iY2wtOGQ4YTU0ZmIiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij41Mzwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkOGE1NGZiIj48cCBjbGFzcz0iY2wtOGQ4YTQ2Y2MiPjxzcGFuIGNsYXNzPSJjbC04ZDg4MDNhOCI+NTM8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgc3R5bGU9Im92ZXJmbG93LXdyYXA6YnJlYWstd29yZDsiPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MDQiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij42Nzwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkOGE1NTA0Ij48cCBjbGFzcz0iY2wtOGQ4YTQ2Y2MiPjxzcGFuIGNsYXNzPSJjbC04ZDg4MDNhOCI+Njc8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgc3R5bGU9Im92ZXJmbG93LXdyYXA6YnJlYWstd29yZDsiPjx0ZCBjbGFzcz0iY2wtOGQ4YTU0ZjEiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij45Njwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkOGE1NGYxIj48cCBjbGFzcz0iY2wtOGQ4YTQ2Y2MiPjxzcGFuIGNsYXNzPSJjbC04ZDg4MDNhOCI+OTY8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgc3R5bGU9Im92ZXJmbG93LXdyYXA6YnJlYWstd29yZDsiPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MDUiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4yMDU8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZDhhNTUwNSI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjIwNTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTRmMSI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjI5ODwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkOGE1NGYxIj48cCBjbGFzcz0iY2wtOGQ4YTQ2Y2MiPjxzcGFuIGNsYXNzPSJjbC04ZDg4MDNhOCI+Mjk4PC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIHN0eWxlPSJvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmQ7Ij48dGQgY2xhc3M9ImNsLThkOGE1NGZiIj48cCBjbGFzcz0iY2wtOGQ4YTQ2Y2MiPjxzcGFuIGNsYXNzPSJjbC04ZDg4MDNhOCI+MzEwPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU0ZmIiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4zMTA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgc3R5bGU9Im92ZXJmbG93LXdyYXA6YnJlYWstd29yZDsiPjx0ZCBjbGFzcz0iY2wtOGQ4YTU0ZmIiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4zNTE8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZDhhNTRmYiI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjM1MTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUwNCI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjQwNDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkOGE1NTA0Ij48cCBjbGFzcz0iY2wtOGQ4YTQ2Y2MiPjxzcGFuIGNsYXNzPSJjbC04ZDg4MDNhOCI+NDA0PC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIHN0eWxlPSJvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmQ7Ij48dGQgY2xhc3M9ImNsLThkOGE1NTBlIj48cCBjbGFzcz0iY2wtOGQ4YTQ2Y2MiPjxzcGFuIGNsYXNzPSJjbC04ZDg4MDNhOCI+NDE4PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MGUiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij40MTg8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgc3R5bGU9Im92ZXJmbG93LXdyYXA6YnJlYWstd29yZDsiPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MDUiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij40MjM8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZDhhNTUwNSI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjQyMzwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTRmMSI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjQyODwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkOGE1NGYxIj48cCBjbGFzcz0iY2wtOGQ4YTQ2Y2MiPjxzcGFuIGNsYXNzPSJjbC04ZDg4MDNhOCI+NDI4PC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIHN0eWxlPSJvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmQ7Ij48dGQgY2xhc3M9ImNsLThkOGE1NTBmIj48cCBjbGFzcz0iY2wtOGQ4YTQ2Y2MiPjxzcGFuIGNsYXNzPSJjbC04ZDg4MDNhOCI+NDQyPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MGYiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij40NDI8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgc3R5bGU9Im92ZXJmbG93LXdyYXA6YnJlYWstd29yZDsiPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MTAiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij40NDQ8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZDhhNTUxMCI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjQ0NDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUwZSI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjU0ODwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkOGE1NTBlIj48cCBjbGFzcz0iY2wtOGQ4YTQ2Y2MiPjxzcGFuIGNsYXNzPSJjbC04ZDg4MDNhOCI+NTQ4PC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIHN0eWxlPSJvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmQ7Ij48dGQgY2xhc3M9ImNsLThkOGE1NTBmIj48cCBjbGFzcz0iY2wtOGQ4YTQ2Y2MiPjxzcGFuIGNsYXNzPSJjbC04ZDg4MDNhOCI+NzcyPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MGYiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij43NzI8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgc3R5bGU9Im92ZXJmbG93LXdyYXA6YnJlYWstd29yZDsiPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MGUiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij44MzU8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZDhhNTUwZSI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjgzNTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUwZSI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjg1MDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkOGE1NTBlIj48cCBjbGFzcz0iY2wtOGQ4YTQ2Y2MiPjxzcGFuIGNsYXNzPSJjbC04ZDg4MDNhOCI+ODUwPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIHN0eWxlPSJvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmQ7Ij48dGQgY2xhc3M9ImNsLThkOGE1NTBlIj48cCBjbGFzcz0iY2wtOGQ4YTQ2Y2MiPjxzcGFuIGNsYXNzPSJjbC04ZDg4MDNhOCI+ODUzPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MGUiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij44NTM8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgc3R5bGU9Im92ZXJmbG93LXdyYXA6YnJlYWstd29yZDsiPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MTgiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij45MTA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZDhhNTUxOCI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjkxMDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUxOCI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjkzOTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkOGE1NTE4Ij48cCBjbGFzcz0iY2wtOGQ4YTQ2Y2MiPjxzcGFuIGNsYXNzPSJjbC04ZDg4MDNhOCI+OTM5PC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIHN0eWxlPSJvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmQ7Ij48dGQgY2xhc3M9ImNsLThkOGE1NGYxIj48cCBjbGFzcz0iY2wtOGQ4YTQ2Y2MiPjxzcGFuIGNsYXNzPSJjbC04ZDg4MDNhOCI+OTY2PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU0ZjEiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij45NjY8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgc3R5bGU9Im92ZXJmbG93LXdyYXA6YnJlYWstd29yZDsiPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MjIiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij45Njg8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZDhhNTUyMiI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjk2ODwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyMyI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsMDAzPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MjMiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDAwMzwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyYyI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsMDA2PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MmMiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDAwNjwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyZCI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsMDQ1PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MmQiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDA0NTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyZCI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsMDU4PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MmQiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDA1ODwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyZCI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsMTU0PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MmQiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDE1NDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyYyI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsMjM2PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MmMiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDIzNjwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyZSI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsMjk0PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MmUiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDI5NDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyMyI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsMzk1PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MjMiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDM5NTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyMyI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsNTM3PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MjMiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDUzNzwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyZCI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsNTU0PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MmQiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDU1NDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyZCI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsNTg3PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MmQiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDU4Nzwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyYyI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsNjk0PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MmMiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDY5NDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyZCI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsNzg5PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MmQiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDc4OTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyZSI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsODMyPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MmUiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDgzMjwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyYyI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsODY2PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MmMiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDg2Njwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyZCI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsOTA0PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MmQiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDkwNDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyZSI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsOTIwPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MmUiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDkyMDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyMyI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsOTUxPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MjMiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDk1MTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyZSI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsOTUyPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MmUiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDk1Mjwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyMyI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsOTUzPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MjMiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDk1Mzwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyZCI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsOTU0PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MmQiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDk1NDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyMyI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsOTU1PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MjMiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDk1NTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyZCI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsOTgxPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MmQiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDk4MTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyZCI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsOTg0PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MmQiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDk4NDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUyZCI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsOTg1PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MmQiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDk4NTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZDhhNTUzNiI+PHAgY2xhc3M9ImNsLThkOGE0NmNjIj48c3BhbiBjbGFzcz0iY2wtOGQ4ODAzYTgiPjEsOTg2PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGQ4YTU1MzYiPjxwIGNsYXNzPSJjbC04ZDhhNDZjYyI+PHNwYW4gY2xhc3M9ImNsLThkODgwM2E4Ij4xLDk4Njwvc3Bhbj48L3A+PC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj4KYGBgCgoKIyMgUmVsYXRlZG5lc3MKPCEtLSBodHRwczovL3JwdWJzLmNvbS9FQVZXaW5nL3N5bWJvbHMgLS0+CldlIGNhbGN1bGF0ZSBJZGVudGl0eS1ieS1EZXNjZW50IChJQlMpIHRvIGlkZW50aWZ5IGR1cGxpY2F0ZWQgYW5kIHJlbGF0ZWQgc2FtcGxlcy4gSW4gVGFibGUgXEByZWYodGFiOnNob3dyZWxhdGVkbmVzcykgd2Ugc2hvdyBob3cgbXVjaCBETkEgaXMgc2hhcmVkIGJldHdlZW4gaW5kaXZpZHVhbHMgZGVwZW5kaW5nIG9uIHRoZWlyIHJlbGF0aW9uW0BzdGFwbGVzMjAxNF0uIElCUyBpcyBtZWFzdXJlZCBieSBjYWxjdWxhdGluZyBwaS1oYXQgKCRcd2lkZWhhdHtccGl9JCksIHdoaWNoIGlzIGluIGVzc2VuY2UgdGhlIHByb3BvcnRpb24gb2YgdGhlIEROQSB0aGF0IGEgcGFpciBvZiBzYW1wbGVzIHNoYXJlLiBUbyBjYWxjdWxhdGUgdGhpcywgd2UgbmVlZGVkIHRoaXMgdWx0cmFjbGVhbiBkYXRhc2V0LCB3aXRob3V0IGxvdy1xdWFsaXR5IFNOUHMgYW5kIHdpdGhvdXQgaGlnaC1MRCByZWdpb25zLiAKCgoKCgpgYGB7PWh0bWx9CjxkaXYgY2xhc3M9InRhYndpZCI+PHN0eWxlPi5jbC04ZGJiNTc2Y3t9LmNsLThkYjRjZDUye2ZvbnQtZmFtaWx5OidIZWx2ZXRpY2EnO2ZvbnQtc2l6ZToxMXB0O2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0eWxlOm5vcm1hbDt0ZXh0LWRlY29yYXRpb246bm9uZTtjb2xvcjpyZ2JhKDAsIDAsIDAsIDEuMDApO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7fS5jbC04ZGI3NTMwNnttYXJnaW46MDt0ZXh0LWFsaWduOmxlZnQ7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO3BhZGRpbmctYm90dG9tOjVwdDtwYWRkaW5nLXRvcDo1cHQ7cGFkZGluZy1sZWZ0OjVwdDtwYWRkaW5nLXJpZ2h0OjVwdDtsaW5lLWhlaWdodDogMTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O30uY2wtOGRiNzUzMDd7bWFyZ2luOjA7dGV4dC1hbGlnbjpyaWdodDtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7cGFkZGluZy1ib3R0b206NXB0O3BhZGRpbmctdG9wOjVwdDtwYWRkaW5nLWxlZnQ6NXB0O3BhZGRpbmctcmlnaHQ6NXB0O2xpbmUtaGVpZ2h0OiAxO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7fS5jbC04ZGI3NjY3YXt3aWR0aDo0LjEwOWluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAxLjVwdCBzb2xpZCByZ2JhKDEwMiwgMTAyLCAxMDIsIDEuMDApO2JvcmRlci10b3A6IDEuNXB0IHNvbGlkIHJnYmEoMTAyLCAxMDIsIDEwMiwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZGI3NjY4NHt3aWR0aDoxLjIzaW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDEuNXB0IHNvbGlkIHJnYmEoMTAyLCAxMDIsIDEwMiwgMS4wMCk7Ym9yZGVyLXRvcDogMS41cHQgc29saWQgcmdiYSgxMDIsIDEwMiwgMTAyLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkYjc2Njg1e3dpZHRoOjAuNzM3aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDEuNXB0IHNvbGlkIHJnYmEoMTAyLCAxMDIsIDEwMiwgMS4wMCk7Ym9yZGVyLXRvcDogMS41cHQgc29saWQgcmdiYSgxMDIsIDEwMiwgMTAyLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkYjc2Njg2e3dpZHRoOjAuODA1aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDEuNXB0IHNvbGlkIHJnYmEoMTAyLCAxMDIsIDEwMiwgMS4wMCk7Ym9yZGVyLXRvcDogMS41cHQgc29saWQgcmdiYSgxMDIsIDEwMiwgMTAyLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkYjc2Njhle3dpZHRoOjAuNTI1aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDEuNXB0IHNvbGlkIHJnYmEoMTAyLCAxMDIsIDEwMiwgMS4wMCk7Ym9yZGVyLXRvcDogMS41cHQgc29saWQgcmdiYSgxMDIsIDEwMiwgMTAyLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkYjc2Njhme3dpZHRoOjQuMTA5aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZGI3NjY5MHt3aWR0aDoxLjIzaW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZGI3NjY5OHt3aWR0aDowLjczN2luO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGRiNzY2YTJ7d2lkdGg6MC44MDVpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkYjc2NmEze3dpZHRoOjAuNTI1aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZGI3NjZhY3t3aWR0aDo0LjEwOWluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGRiNzY2YzB7d2lkdGg6MS4yM2luO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGRiNzY2YzF7d2lkdGg6MC43MzdpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkYjc2NmNhe3dpZHRoOjAuODA1aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZGI3NjZjYnt3aWR0aDowLjUyNWluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGRiNzY2ZDR7d2lkdGg6NC4xMDlpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkYjc2NmQ1e3dpZHRoOjEuMjNpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkYjc2NmRle3dpZHRoOjAuNzM3aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZGI3NjZkZnt3aWR0aDowLjgwNWluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGRiNzY2ZTh7d2lkdGg6MC41MjVpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkYjc2NmU5e3dpZHRoOjQuMTA5aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZGI3NjZlYXt3aWR0aDoxLjIzaW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZGI3NjZmMnt3aWR0aDowLjczN2luO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGRiNzY2ZjN7d2lkdGg6MC44MDVpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkYjc2NzA2e3dpZHRoOjAuNTI1aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZGI3NjcwN3t3aWR0aDo0LjEwOWluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGRiNzY3MTB7d2lkdGg6MS4yM2luO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGRiNzY3MjR7d2lkdGg6MC43MzdpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkYjc2NzI1e3dpZHRoOjAuODA1aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZGI3NjcyZXt3aWR0aDowLjUyNWluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGRiNzY3MmZ7d2lkdGg6NC4xMDlpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkYjc2NzMwe3dpZHRoOjEuMjNpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkYjc2NzM4e3dpZHRoOjAuNzM3aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZGI3NjczOXt3aWR0aDowLjgwNWluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGRiNzY3NDJ7d2lkdGg6MC41MjVpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkYjc2NzQze3dpZHRoOjQuMTA5aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZGI3Njc0Y3t3aWR0aDoxLjIzaW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZGI3Njc0ZHt3aWR0aDowLjczN2luO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGRiNzY3NTZ7d2lkdGg6MC44MDVpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkYjc2NzU3e3dpZHRoOjAuNTI1aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZGI3Njc2MHt3aWR0aDo0LjEwOWluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGRiNzY3NjF7d2lkdGg6MS4yM2luO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGRiNzY3NmF7d2lkdGg6MC43MzdpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkYjc2NzZie3dpZHRoOjAuODA1aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZGI3Njc2Y3t3aWR0aDowLjUyNWluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGRiNzY3NzR7d2lkdGg6NC4xMDlpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkYjc2Nzc1e3dpZHRoOjEuMjNpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkYjc2Nzc2e3dpZHRoOjAuNzM3aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZGI3Njc3ZXt3aWR0aDowLjgwNWluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGRiNzY3N2Z7d2lkdGg6MC41MjVpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkYjc2Nzg4e3dpZHRoOjQuMTA5aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDEuNXB0IHNvbGlkIHJnYmEoMTAyLCAxMDIsIDEwMiwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGRiNzY3ODl7d2lkdGg6MS4yM2luO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAxLjVwdCBzb2xpZCByZ2JhKDEwMiwgMTAyLCAxMDIsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkYjc2Nzkye3dpZHRoOjAuNzM3aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDEuNXB0IHNvbGlkIHJnYmEoMTAyLCAxMDIsIDEwMiwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGRiNzY3YzR7d2lkdGg6MC44MDVpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMS41cHQgc29saWQgcmdiYSgxMDIsIDEwMiwgMTAyLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZGI3NjdjNXt3aWR0aDowLjUyNWluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAxLjVwdCBzb2xpZCByZ2JhKDEwMiwgMTAyLCAxMDIsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9PC9zdHlsZT48dGFibGUgZGF0YS1xdWFydG8tZGlzYWJsZS1wcm9jZXNzaW5nPSd0cnVlJyBjbGFzcz0nY2wtOGRiYjU3NmMnPgoKYGBgCgo8Y2FwdGlvbiBzdHlsZT0iZGlzcGxheTp0YWJsZS1jYXB0aW9uOyI+KFwjdGFiOnNob3dyZWxhdGVkbmVzcyk8c3Bhbj5GYW1pbGlhbCByZWxhdGlvbnMgYW5kICUgRE5BIHNoYXJlZC48L3NwYW4+PC9jYXB0aW9uPgoKYGBgez1odG1sfQoKPHRoZWFkPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRoIGNsYXNzPSJjbC04ZGI3NjY3YSI+PHAgY2xhc3M9ImNsLThkYjc1MzA2Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPlJlbGF0ZWRuZXNzPC9zcGFuPjwvcD48L3RoPjx0aCBjbGFzcz0iY2wtOGRiNzY2ODQiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNiI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj4lLkROQS5zaGFyaW5nPC9zcGFuPjwvcD48L3RoPjx0aCBjbGFzcz0iY2wtOGRiNzY2ODUiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNiI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj5JQkQwPC9zcGFuPjwvcD48L3RoPjx0aCBjbGFzcz0iY2wtOGRiNzY2ODYiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNiI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj5JQkQxPC9zcGFuPjwvcD48L3RoPjx0aCBjbGFzcz0iY2wtOGRiNzY2OGUiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNyI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj5JQkQyPC9zcGFuPjwvcD48L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+PHRyIHN0eWxlPSJvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmQ7Ij48dGQgY2xhc3M9ImNsLThkYjc2NjhmIj48cCBjbGFzcz0iY2wtOGRiNzUzMDYiPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+TW9ub3p5Z290aWMgdHdpbnMgICAgICAgICAgPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRiNzY2OTAiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNiI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj4gwrExMDAlPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRiNzY2OTgiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNiI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj4wPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRiNzY2YTIiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNiI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj4xPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRiNzY2YTMiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNyI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj4wLjAwPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIHN0eWxlPSJvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmQ7Ij48dGQgY2xhc3M9ImNsLThkYjc2NmFjIj48cCBjbGFzcz0iY2wtOGRiNzUzMDYiPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+UGFyZW50cy9jaGlsZCAgICAgICAgICAgICAgPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRiNzY2YzAiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNiI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj4gwrE1MCU8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZGI3NjZjMSI+PHAgY2xhc3M9ImNsLThkYjc1MzA2Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPjAuMjU8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZGI3NjZjYSI+PHAgY2xhc3M9ImNsLThkYjc1MzA2Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPjAuNTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkYjc2NmNiIj48cCBjbGFzcz0iY2wtOGRiNzUzMDciPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+MC4yNTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZGI3NjZkNCI+PHAgY2xhc3M9ImNsLThkYjc1MzA2Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPlNpYmxpbmcgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkYjc2NmQ1Ij48cCBjbGFzcz0iY2wtOGRiNzUzMDYiPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+IMKxNTAlPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRiNzY2ZGUiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNiI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj4wLjI1PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRiNzY2ZGYiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNiI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj4wLjU8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZGI3NjZlOCI+PHAgY2xhc3M9ImNsLThkYjc1MzA3Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPjAuMjU8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgc3R5bGU9Im92ZXJmbG93LXdyYXA6YnJlYWstd29yZDsiPjx0ZCBjbGFzcz0iY2wtOGRiNzY2ZTkiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNiI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj5GcmF0ZXJuYWwgdHdpbnMgICAgICAgICAgICA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZGI3NjZlYSI+PHAgY2xhc3M9ImNsLThkYjc1MzA2Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPiDCsTUwJTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkYjc2NmYyIj48cCBjbGFzcz0iY2wtOGRiNzUzMDYiPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+MC4yNTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkYjc2NmYzIj48cCBjbGFzcz0iY2wtOGRiNzUzMDYiPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+MC41PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRiNzY3MDYiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNyI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj4wLjI1PC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIHN0eWxlPSJvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmQ7Ij48dGQgY2xhc3M9ImNsLThkYjc2NmQ0Ij48cCBjbGFzcz0iY2wtOGRiNzUzMDYiPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+R3JhbmRwYXJlbnQvZ3JhbmRjaGlsZCAgICAgPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRiNzY2ZDUiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNiI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj4gwrEyNSU8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZGI3NjZkZSI+PHAgY2xhc3M9ImNsLThkYjc1MzA2Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPjAuNTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkYjc2NmRmIj48cCBjbGFzcz0iY2wtOGRiNzUzMDYiPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+MC41PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRiNzY2ZTgiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNyI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj4wLjAwPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIHN0eWxlPSJvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmQ7Ij48dGQgY2xhc3M9ImNsLThkYjc2NzA3Ij48cCBjbGFzcz0iY2wtOGRiNzUzMDYiPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+QXVudC9VbmNsZS9OaWVjZS9OZXBoZXcgICAgPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRiNzY3MTAiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNiI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj4gwrEyNSU8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZGI3NjcyNCI+PHAgY2xhc3M9ImNsLThkYjc1MzA2Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPjAuNTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkYjc2NzI1Ij48cCBjbGFzcz0iY2wtOGRiNzUzMDYiPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+MC41PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRiNzY3MmUiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNyI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj4wLjAwPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIHN0eWxlPSJvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmQ7Ij48dGQgY2xhc3M9ImNsLThkYjc2NzJmIj48cCBjbGFzcz0iY2wtOGRiNzUzMDYiPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+SGFsZi1zaWJsaW5nICAgICAgICAgICAgICAgPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRiNzY3MzAiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNiI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj4gwrEyNSU8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZGI3NjczOCI+PHAgY2xhc3M9ImNsLThkYjc1MzA2Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPjAuNTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkYjc2NzM5Ij48cCBjbGFzcz0iY2wtOGRiNzUzMDYiPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+MC41PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRiNzY3NDIiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNyI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj4wLjAwPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIHN0eWxlPSJvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmQ7Ij48dGQgY2xhc3M9ImNsLThkYjc2NmU5Ij48cCBjbGFzcz0iY2wtOGRiNzUzMDYiPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+Rmlyc3QtY291c2luICAgICAgICAgICAgICAgPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRiNzY2ZWEiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNiI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj4gwrExMi41JTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkYjc2NmYyIj48cCBjbGFzcz0iY2wtOGRiNzUzMDYiPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+MC43NTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkYjc2NmYzIj48cCBjbGFzcz0iY2wtOGRiNzUzMDYiPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+MC4yNTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkYjc2NzA2Ij48cCBjbGFzcz0iY2wtOGRiNzUzMDciPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+MC4wMDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZGI3Njc0MyI+PHAgY2xhc3M9ImNsLThkYjc1MzA2Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPkhhbGYgZmlyc3QtY291c2luICAgICAgICAgIDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkYjc2NzRjIj48cCBjbGFzcz0iY2wtOGRiNzUzMDYiPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+IMKxNi4yNSU8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZGI3Njc0ZCI+PHAgY2xhc3M9ImNsLThkYjc1MzA2Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPjAuODc1PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRiNzY3NTYiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNiI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj4wLjEyNTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkYjc2NzU3Ij48cCBjbGFzcz0iY2wtOGRiNzUzMDciPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+MC4wMDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZGI3NjZhYyI+PHAgY2xhc3M9ImNsLThkYjc1MzA2Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPkZpcnN0LWNvdXNpbiBvbmNlIHJlbW92ZWQgIDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkYjc2NmMwIj48cCBjbGFzcz0iY2wtOGRiNzUzMDYiPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+IMKxNi4yNSU8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZGI3NjZjMSI+PHAgY2xhc3M9ImNsLThkYjc1MzA2Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPjAuODc1PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRiNzY2Y2EiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNiI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj4wLjEyNTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkYjc2NmNiIj48cCBjbGFzcz0iY2wtOGRiNzUzMDciPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+MC4wMDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZGI3Njc2MCI+PHAgY2xhc3M9ImNsLThkYjc1MzA2Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPlNlY29uZC1jb3VzaW4gICAgICAgICAgICAgIDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkYjc2NzYxIj48cCBjbGFzcz0iY2wtOGRiNzUzMDYiPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+IMKxMy4xMyU8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZGI3Njc2YSI+PHAgY2xhc3M9ImNsLThkYjc1MzA2Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPjAuOTM3NTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkYjc2NzZiIj48cCBjbGFzcz0iY2wtOGRiNzUzMDYiPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+Ni4yNUUtMjwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkYjc2NzZjIj48cCBjbGFzcz0iY2wtOGRiNzUzMDciPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+MC4wMDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZGI3Njc2MCI+PHAgY2xhc3M9ImNsLThkYjc1MzA2Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPlNlY29uZC1jb3VzaW4gb25jZSByZW1vdmVkIDwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkYjc2NzYxIj48cCBjbGFzcz0iY2wtOGRiNzUzMDYiPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+IMKxMS41NiU8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZGI3Njc2YSI+PHAgY2xhc3M9ImNsLThkYjc1MzA2Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPjAuOTY4NzU8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZGI3Njc2YiI+PHAgY2xhc3M9ImNsLThkYjc1MzA2Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPjMuMTI1RS0yPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRiNzY3NmMiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNyI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj4wLjAwPC9zcGFuPjwvcD48L3RkPjwvdHI+PHRyIHN0eWxlPSJvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmQ7Ij48dGQgY2xhc3M9ImNsLThkYjc2Nzc0Ij48cCBjbGFzcz0iY2wtOGRiNzUzMDYiPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+RGlzdGFudGx5IHJlbGF0ZWQ8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZGI3Njc3NSI+PHAgY2xhc3M9ImNsLThkYjc1MzA2Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPiZsdDsxLjU2JTwvc3Bhbj48L3A+PC90ZD48dGQgY2xhc3M9ImNsLThkYjc2Nzc2Ij48cCBjbGFzcz0iY2wtOGRiNzUzMDYiPjxzcGFuIGNsYXNzPSJjbC04ZGI0Y2Q1MiI+dmFyaWVzPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRiNzY3N2UiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNiI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj52YXJpZXM8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZGI3Njc3ZiI+PHAgY2xhc3M9ImNsLThkYjc1MzA3Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPjAuMDA8L3NwYW4+PC9wPjwvdGQ+PC90cj48dHIgc3R5bGU9Im92ZXJmbG93LXdyYXA6YnJlYWstd29yZDsiPjx0ZCBjbGFzcz0iY2wtOGRiNzY3ODgiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNiI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj5VbnJlbGF0ZWQgKGluY2x1ZGVzIHJlbGF0aW9uc2hpcHMgYmV5b25kIHRoZSB0aGlyZCBkZWdyZWUpPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRiNzY3ODkiPjxwIGNsYXNzPSJjbC04ZGI3NTMwNiI+PHNwYW4gY2xhc3M9ImNsLThkYjRjZDUyIj4mbHQ7MS41NiU8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZGI3Njc5MiI+PHAgY2xhc3M9ImNsLThkYjc1MzA2Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPjE8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZGI3NjdjNCI+PHAgY2xhc3M9ImNsLThkYjc1MzA2Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPjA8L3NwYW4+PC9wPjwvdGQ+PHRkIGNsYXNzPSJjbC04ZGI3NjdjNSI+PHAgY2xhc3M9ImNsLThkYjc1MzA3Ij48c3BhbiBjbGFzcz0iY2wtOGRiNGNkNTIiPjAuMDA8L3NwYW4+PC9wPjwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+PC9kaXY+CmBgYAoKYFBMSU5LYCBjYWxjdWxhdGVzIHRoZSBpbnRlci1pbmRpdmlkdWFsIHJlbGF0ZWRuZXNzIHVzaW5nIHRoZSBgLS1nZW5vbWVgIGZ1bmN0aW9uLgoKYGBgCnBsaW5rIC0tYmZpbGUgZHVtbXlfcHJvamVjdC9yYXdkYXRhLmNsZWFuLnVsdHJhY2xlYW4gLS1nZW5vbWUgLS1vdXQgZHVtbXlfcHJvamVjdC9yYXdkYXRhLmNsZWFuLnVsdHJhY2xlYW4KYGBgCgpXZSBjYW4gbm93IGlkZW50aWZ5IGFsbCBwYWlycyBvZiBpbmRpdmlkdWFscyB3aXRoIGFuIElCRCA+IDAuMTg1LiBUaGUgY29kZSBsb29rcyBhdCB0aGUgaW5kaXZpZHVhbCBjYWxsIHJhdGVzIHN0b3JlZCBpbiBgcmF3ZGF0YS5pbWlzc2AgYW5kIG91dHB1dHMgdGhlIElEcyBvZiB0aGUgaW5kaXZpZHVhbCB3aXRoIHRoZSBsb3dlc3QgY2FsbCByYXRlIHRvIOKAmGZhaWwtSUJELVFDLnR4dOKAmSBmb3Igc3Vic2VxdWVudCByZW1vdmFsIChUYWJsZSBcQHJlZih0YWI6c2hvd2liZGNhbGxpc3N1ZXMpKS4KCkZpcnN0LCBtb3ZlIHRvIHRoZSBgZHVtbXlfcHJvamVjdGAgZGlyZWN0b3J5LgoKYGBgCmNkIGR1bW15X3Byb2plY3QKYGBgCgpOb3csIGV4ZWN1dGUgdGhpcyBzY3JpcHQgLSBpdCBzaG91bGQgd29yayBqdXN0IGZpbmUgb3V0LW9mLXRoZS1ib3guCgpgYGAKcGVybCAuLi9zY3JpcHRzL3J1bi1JQkQtUUMucGwgcmF3ZGF0YSByYXdkYXRhLmNsZWFuLnVsdHJhY2xlYW4KYGBgCgpHbyBiYWNrIG9uZSBkaXJlY3RvcnkuCgpgYGAKY2QgLi4KYGBgCgoKCgoKCmBgYHs9aHRtbH0KPGRpdiBjbGFzcz0idGFid2lkIj48c3R5bGU+LmNsLThkZDExNTUye30uY2wtOGRjYjhiOTZ7Zm9udC1mYW1pbHk6J0hlbHZldGljYSc7Zm9udC1zaXplOjExcHQ7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3R5bGU6bm9ybWFsO3RleHQtZGVjb3JhdGlvbjpub25lO2NvbG9yOnJnYmEoMCwgMCwgMCwgMS4wMCk7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt9LmNsLThkY2UwZGJje21hcmdpbjowO3RleHQtYWxpZ246cmlnaHQ7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO3BhZGRpbmctYm90dG9tOjVwdDtwYWRkaW5nLXRvcDo1cHQ7cGFkZGluZy1sZWZ0OjVwdDtwYWRkaW5nLXJpZ2h0OjVwdDtsaW5lLWhlaWdodDogMTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O30uY2wtOGRjZTFmNzh7d2lkdGg6MC41NjhpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMS41cHQgc29saWQgcmdiYSgxMDIsIDEwMiwgMTAyLCAxLjAwKTtib3JkZXItdG9wOiAxLjVwdCBzb2xpZCByZ2JhKDEwMiwgMTAyLCAxMDIsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGRjZTFmODJ7d2lkdGg6MC41NjhpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkY2UxZjgze3dpZHRoOjAuNTY4aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItdG9wOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLWxlZnQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItcmlnaHQ6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTttYXJnaW4tYm90dG9tOjA7bWFyZ2luLXRvcDowO21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjA7fS5jbC04ZGNlMWY4Y3t3aWR0aDowLjU2OGluO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dmVydGljYWwtYWxpZ246IG1pZGRsZTtib3JkZXItYm90dG9tOiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO30uY2wtOGRjZTFmOGR7d2lkdGg6MC41NjhpbjtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Ym9yZGVyLWJvdHRvbTogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci10b3A6IDAgc29saWQgcmdiYSgwLCAwLCAwLCAxLjAwKTtib3JkZXItbGVmdDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1yaWdodDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO21hcmdpbi1ib3R0b206MDttYXJnaW4tdG9wOjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDt9LmNsLThkY2UxZjk2e3dpZHRoOjAuNTY4aW47YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2JvcmRlci1ib3R0b206IDEuNXB0IHNvbGlkIHJnYmEoMTAyLCAxMDIsIDEwMiwgMS4wMCk7Ym9yZGVyLXRvcDogMCBzb2xpZCByZ2JhKDAsIDAsIDAsIDEuMDApO2JvcmRlci1sZWZ0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7Ym9yZGVyLXJpZ2h0OiAwIHNvbGlkIHJnYmEoMCwgMCwgMCwgMS4wMCk7bWFyZ2luLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowO308L3N0eWxlPjx0YWJsZSBkYXRhLXF1YXJ0by1kaXNhYmxlLXByb2Nlc3Npbmc9J3RydWUnIGNsYXNzPSdjbC04ZGQxMTU1Mic+CgpgYGAKCjxjYXB0aW9uIHN0eWxlPSJkaXNwbGF5OnRhYmxlLWNhcHRpb247Ij4oXCN0YWI6c2hvd2liZGNhbGxpc3N1ZXMpPHNwYW4+RmFpbGVkIElCRCBhbmQgY2FsbHJhdGUuPC9zcGFuPjwvY2FwdGlvbj4KCmBgYHs9aHRtbH0KCjx0aGVhZD48dHIgc3R5bGU9Im92ZXJmbG93LXdyYXA6YnJlYWstd29yZDsiPjx0aCBjbGFzcz0iY2wtOGRjZTFmNzgiPjxwIGNsYXNzPSJjbC04ZGNlMGRiYyI+PHNwYW4gY2xhc3M9ImNsLThkY2I4Yjk2Ij5GSUQ8L3NwYW4+PC9wPjwvdGg+PHRoIGNsYXNzPSJjbC04ZGNlMWY3OCI+PHAgY2xhc3M9ImNsLThkY2UwZGJjIj48c3BhbiBjbGFzcz0iY2wtOGRjYjhiOTYiPklJRDwvc3Bhbj48L3A+PC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZGNlMWY4MiI+PHAgY2xhc3M9ImNsLThkY2UwZGJjIj48c3BhbiBjbGFzcz0iY2wtOGRjYjhiOTYiPjEsOTUyPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRjZTFmODIiPjxwIGNsYXNzPSJjbC04ZGNlMGRiYyI+PHNwYW4gY2xhc3M9ImNsLThkY2I4Yjk2Ij4xLDk1Mjwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZGNlMWY4MyI+PHAgY2xhc3M9ImNsLThkY2UwZGJjIj48c3BhbiBjbGFzcz0iY2wtOGRjYjhiOTYiPjEsOTUzPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRjZTFmODMiPjxwIGNsYXNzPSJjbC04ZGNlMGRiYyI+PHNwYW4gY2xhc3M9ImNsLThkY2I4Yjk2Ij4xLDk1Mzwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZGNlMWY4YyI+PHAgY2xhc3M9ImNsLThkY2UwZGJjIj48c3BhbiBjbGFzcz0iY2wtOGRjYjhiOTYiPjEsOTU0PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRjZTFmOGMiPjxwIGNsYXNzPSJjbC04ZGNlMGRiYyI+PHNwYW4gY2xhc3M9ImNsLThkY2I4Yjk2Ij4xLDk1NDwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZGNlMWY4MyI+PHAgY2xhc3M9ImNsLThkY2UwZGJjIj48c3BhbiBjbGFzcz0iY2wtOGRjYjhiOTYiPjEsOTU1PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRjZTFmODMiPjxwIGNsYXNzPSJjbC04ZGNlMGRiYyI+PHNwYW4gY2xhc3M9ImNsLThkY2I4Yjk2Ij4xLDk1NTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZGNlMWY4MyI+PHAgY2xhc3M9ImNsLThkY2UwZGJjIj48c3BhbiBjbGFzcz0iY2wtOGRjYjhiOTYiPjEsOTU3PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRjZTFmODMiPjxwIGNsYXNzPSJjbC04ZGNlMGRiYyI+PHNwYW4gY2xhc3M9ImNsLThkY2I4Yjk2Ij4xLDk1Nzwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZGNlMWY4MyI+PHAgY2xhc3M9ImNsLThkY2UwZGJjIj48c3BhbiBjbGFzcz0iY2wtOGRjYjhiOTYiPjEsOTU5PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRjZTFmODMiPjxwIGNsYXNzPSJjbC04ZGNlMGRiYyI+PHNwYW4gY2xhc3M9ImNsLThkY2I4Yjk2Ij4xLDk1OTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZGNlMWY4ZCI+PHAgY2xhc3M9ImNsLThkY2UwZGJjIj48c3BhbiBjbGFzcz0iY2wtOGRjYjhiOTYiPjEsOTYxPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRjZTFmOGQiPjxwIGNsYXNzPSJjbC04ZGNlMGRiYyI+PHNwYW4gY2xhc3M9ImNsLThkY2I4Yjk2Ij4xLDk2MTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZGNlMWY4ZCI+PHAgY2xhc3M9ImNsLThkY2UwZGJjIj48c3BhbiBjbGFzcz0iY2wtOGRjYjhiOTYiPjEsOTYzPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRjZTFmOGQiPjxwIGNsYXNzPSJjbC04ZGNlMGRiYyI+PHNwYW4gY2xhc3M9ImNsLThkY2I4Yjk2Ij4xLDk2Mzwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZGNlMWY4ZCI+PHAgY2xhc3M9ImNsLThkY2UwZGJjIj48c3BhbiBjbGFzcz0iY2wtOGRjYjhiOTYiPjEsOTY1PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRjZTFmOGQiPjxwIGNsYXNzPSJjbC04ZGNlMGRiYyI+PHNwYW4gY2xhc3M9ImNsLThkY2I4Yjk2Ij4xLDk2NTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZGNlMWY4ZCI+PHAgY2xhc3M9ImNsLThkY2UwZGJjIj48c3BhbiBjbGFzcz0iY2wtOGRjYjhiOTYiPjEsOTY3PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRjZTFmOGQiPjxwIGNsYXNzPSJjbC04ZGNlMGRiYyI+PHNwYW4gY2xhc3M9ImNsLThkY2I4Yjk2Ij4xLDk2Nzwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZGNlMWY4ZCI+PHAgY2xhc3M9ImNsLThkY2UwZGJjIj48c3BhbiBjbGFzcz0iY2wtOGRjYjhiOTYiPjEsOTY5PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRjZTFmOGQiPjxwIGNsYXNzPSJjbC04ZGNlMGRiYyI+PHNwYW4gY2xhc3M9ImNsLThkY2I4Yjk2Ij4xLDk2OTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZGNlMWY4MyI+PHAgY2xhc3M9ImNsLThkY2UwZGJjIj48c3BhbiBjbGFzcz0iY2wtOGRjYjhiOTYiPjEsOTcxPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRjZTFmODMiPjxwIGNsYXNzPSJjbC04ZGNlMGRiYyI+PHNwYW4gY2xhc3M9ImNsLThkY2I4Yjk2Ij4xLDk3MTwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZGNlMWY4MyI+PHAgY2xhc3M9ImNsLThkY2UwZGJjIj48c3BhbiBjbGFzcz0iY2wtOGRjYjhiOTYiPjEsOTczPC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRjZTFmODMiPjxwIGNsYXNzPSJjbC04ZGNlMGRiYyI+PHNwYW4gY2xhc3M9ImNsLThkY2I4Yjk2Ij4xLDk3Mzwvc3Bhbj48L3A+PC90ZD48L3RyPjx0ciBzdHlsZT0ib3ZlcmZsb3ctd3JhcDpicmVhay13b3JkOyI+PHRkIGNsYXNzPSJjbC04ZGNlMWY5NiI+PHAgY2xhc3M9ImNsLThkY2UwZGJjIj48c3BhbiBjbGFzcz0iY2wtOGRjYjhiOTYiPjEsOTc1PC9zcGFuPjwvcD48L3RkPjx0ZCBjbGFzcz0iY2wtOGRjZTFmOTYiPjxwIGNsYXNzPSJjbC04ZGNlMGRiYyI+PHNwYW4gY2xhc3M9ImNsLThkY2I4Yjk2Ij4xLDk3NTwvc3Bhbj48L3A+PC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT48L2Rpdj4KYGBgCgojIyBBbmNlc3RyYWwgYmFja2dyb3VuZAoKVXNpbmcgYSAqKlByaW5jaXBhbCBDb21wb25lbnQgQW5hbHlzaXMgKFBDQSkqKiB3ZSBjYW4gcmVkdWNlIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBkYXRhLCBhbmQgcHJvamVjdCB0aGUgImFuY2VzdHJhbCBkaXN0YW5jZXMiLiBJbiBvdGhlciB3b3JkcywgdGhlIHByaW5jaXBhbCBjb21wb25lbnQgMSAodGhlIGZpcnN0IGRpbWVuc2lvbikgYW5kIHByaW5jaXBhbCBjb21wb25lbnQgMiAodGhlIHNlY29uZCBkaW1lbnNpb24pIHdoaWNoIHdpbGwgY2FwdHVyZSBtb3N0IG9mIHRoZSB2YXJpYXRpb24gaW4gdGhlIGRhdGEgYW5kIHJlcHJlc2VudCBob3cgbXVjaCBlYWNoIHNhbXBsZSBpcyBhbGlrZSB0aGUgbmV4dC4gQW5kIHdoZW4gY29tcGFyZWQgdG8gYSByZWZlcmVuY2UsIHlvdSBjYW4gZGVkdWNlIHRoZSBhbmNlc3RyYWwgYmFja2dyb3VuZCBvZiBlYWNoIHNhbXBsZSBpbiB5b3VyIGRhdGFzZXQuIE9mIGNvdXJzZSB0aGlzIGlzIHJlbGF0aXZlOiB3ZSB3aWxsIG9ubHkga25vdyB0aGF0IGEgZ2l2ZW4gc2FtcGxlIGlzIHZlcnkgbXVjaCBhIGxpa2Ugc2FtcGxlcyBmcm9tIGEgZ2l2ZW4gcG9wdWxhdGlvbiB0aGF0IF9leGlzdHMgdG9kYXlfLiAKCk5vd2FkYXlzIHdlIHJ1biBzdWNoIFBDQSBhZ2FpbnN0IGEgbGFyZ2UgYW5kIGRpdmVyc2UgZGF0YXNldCBjb250YWluaW5nIG1hbnkgZGlmZmVyZW50IHBvcHVsYXRpb25zLiBPbGQtc2Nob29sIEdXQVMgKHByZS0yMDA5KSB3b3VsZCBjb21wYXJlIGEgZGF0YXNldCBhZ2FpbnN0IFtIYXBNYXAgM10oaHR0cHM6Ly93d3cuYnJvYWRpbnN0aXR1dGUub3JnL21lZGljYWwtYW5kLXBvcHVsYXRpb24tZ2VuZXRpY3MvaGFwbWFwLTMpe3RhcmdldD0iX2JsYW5rIn0sIG5vd2FkYXlzIHdlIHByZWZlciBhdCBhIG1pbmltdW0gdGhlIFsxMDAwRyBwaGFzZSAzIHBvcHVsYXRpb25zXShodHRwczovL3d3dy5pbnRlcm5hdGlvbmFsZ2Vub21lLm9yZyl7dGFyZ2V0PSJfYmxhbmsifS4gQW5kIGluIHRob3NlIGFuY2llbnQgdGltZXMgdGhlIHByZWZlcnJlZCBzb2Z0d2FyZSB0byBydW4gYSBQQ0Egd2FzIF9FaWdlbnNvZnRfIHdoaWNoIGlzIGEgYml0IHRyaWNreSB0byBpbnN0YWxsIChzZWUgQ2hhcHRlciBcQHJlZihlaWdlbnNvZnQpKSwgYnV0IG5vd2FkYXlzIGBQTElOS2AgcHJvdmlkZXMgdGhlIGAtLXBjYWAtZmxhZy4gCgpGb3IgdGhlIHB1cnBvc2Ugb2YgdGhpcyBwcmFjdGljYWwgcHJpbWVyIHdlIHdpbGwgcnVuIFBDQSB1c2luZyBgUExJTktgIGFuZCBpdHMgYC0tcGNhYC1mbGFnIGFnYWluc3QgYW4gZWFybGllciB2ZXJzaW9uIG9mIDEwMDBHLCBwaGFzZSAxLCB3aGljaCBpcyBzbGlnaHRseSBzbWFsbGVyIGFuZCBqdXN0IGFzIGdvb2QgdG8gdXNlLiAKCiMjIyAxMDAwRyBwaGFzZSAxCgpXZSB3aWxsIHByb2plY3Qgb3VyIGRhdGEgdG8gdGhlIHJlZmVyZW5jZSwgaW4gdGhpcyBleGFtcGxlIDEwMDBHIHBoYXNlIDEgKDEwMDBHKSwgd2hpY2ggaW5jbHVkZXMgaW5kaXZpZHVhbHMgZnJvbSAxNCBkaXN0aW5jdCBnbG9iYWwgcG9wdWxhdGlvbnMgYWNyb3NzIDQgJ3N1cGVyJy1wb3B1bGF0aW9ucyAoRXVyb3BlYW5zIFtgRVVSYF0sIEFmcmljYW5zIFtgQUZSYF0sIEVhc3QtQXNpYW5zIFtgRUFTYF0sIGFuZCBMYXRpbiBBbWVyaWNhbnMgW2BBTVJgXSkuIEluIHRoZSByZWFsLXdvcmxkLCB1c2luZyBwaGFzZSAxIG1heSBiZSBqdXN0IGZpbmUsIGJ1dCBpZiB5b3UgdGhpbmsgeW91ciBwb3B1bGF0aW9uIGV2b2x2ZWQgdGhyb3VnaCBleHRlbnNpdmUgbWlncmF0aW9uIGl0J3MgcHJvYmFibHkgYmVzdCB0byB1c2UgcGhhc2UgMyBkYXRhLiBJbiBvdGhlciB3b3JkcywgdGhlIGNob2ljZSBvZiByZWZlcmVuY2UgaXMgcmVhbGx5IGRlcGVuZGluZyBvbiB0aGUgZGF0YXNldC4KCkZpcnN0LCB3ZSB3aWxsIG1lcmdlIG91ciBkYXRhIHdpdGggMTAwMEcuIFRoZSBhbGxlbGVzIGF0IGVhY2ggbWFya2VyIG11c3QgYmUgYWxpZ25lZCB0byB0aGUgc2FtZSBETkEgc3RyYW5kIHRvIGFsbG93IG91ciBkYXRhIHRvIG1lcmdlIGNvcnJlY3RseS4gQmVjYXVzZSBub3QgYWxsIFNOUHMgYXJlIHJlcXVpcmVkIGZvciB0aGlzIGFuYWx5c2lzIHRoZSBBLT5UIGFuZCBDLT5HIFNOUHMsIHdoaWNoIGFyZSBtb3JlIGRpZmZpY3VsdCB0byBhbGlnbiwgY2FuIGJlIG9taXR0ZWQuCgojIyMjIEZpbHRlciB0aGUgMTAwMEcgZGF0YQoKRmlyc3QsIHdlIHNob3VsZCBnZXQgYSBsaXN0IG9mIHJlbGV2YW50IHZhcmlhbnRzIGZyb20gb3VyIGByYXdkYXRhYC1kYXRhc2V0LiBXZSBkb24ndCBuZWVkIHRoZSBvdGhlciB2YXJpYW50cyBwcmVzZW50IGluIHRoZSAxMDAwRyBkYXRhc2V0LCByaWdodD8KCmBgYApjYXQgZHVtbXlfcHJvamVjdC9yYXdkYXRhLmJpbSB8IGdyZXAgInJzIiA+IGR1bW15X3Byb2plY3QvYWxsLnZhcmlhbnRzLnR4dApgYGAKCkV4dHJhY3QgdGhvc2UgZnJvbSB0aGUgMTAwMEcgcGhhc2UgMSBkYXRhLgoKYGBgCnBsaW5rIC0tYmZpbGUgcmVmXzFrZ19waGFzZTFfYWxsLzFrZ19waGFzZTFfYWxsIC0tZXh0cmFjdCBkdW1teV9wcm9qZWN0L2FsbC52YXJpYW50cy50eHQgLS1tYWtlLWJlZCAtLW91dCByZWZfMWtnX3BoYXNlMV9hbGwvMWtnX3BoYXNlMV9yYXcKYGBgCgojIyMjIEZpbHRlciBBL1QgJiBDL0cgU05QcwoKQXMgZXhwbGFpbmVkLCB0aGUgQS9UIGFuZCBDL0cgU05QcyBhcmUgcHJvYmxlbWF0aWMsIHdlIHdhbnQgdG8gZXhjbHVkZSB0aGVzZSB0b28uIFNvIGxldCdzIGdldCBhIGxpc3Qgb2YgQS9UIGFuZCBDL0cgdmFyaWFudHMgZnJvbSAxMDAwRyB0byBleGNsdWRlIC0gdGhpcyBtYXkgdGFrZSBhIHdoaWxlLgoKYGBgCmNhdCByZWZfMWtnX3BoYXNlMV9hbGwvMWtnX3BoYXNlMV9yYXcuYmltIHwgXAphd2sgJygkNSA9PSAiQSIgJiYgJDYgPT0gIlQiKSB8fCAoJDUgPT0gIlQiICYmICQ2ID09ICJBIikgfHwgKCQ1ID09ICJDIiAmJiAkNiA9PSAiRyIpIHx8ICgkNSA9PSAiRyIgJiYgJDYgPT0gIkMiKScgfCBhd2sgJ3sgcHJpbnQgJDIsICQxLCAkNCwgJDMsICQ1LCAkNiB9JyBcCj4gcmVmXzFrZ19waGFzZTFfYWxsL2FsbC4xa2cuYXRjZy52YXJpYW50cy50eHQKYGBgCgpFeGNsdWRlIHRob3NlIEEvVCBhbmQgQy9HIHZhcmlhbnRzIGluIGJvdGggZGF0YXNldHMgYW5kIGF0IHRoZSBzYW1lIHRpbWUgZmlsdGVyIHRvIG9ubHkgcmV0YWluIGhpZ2gtcXVhbGl0eSBkYXRhIGFuZCBleGNsdWRlIG5vbi1hdXRvc29tYWwgdmFyaWFudHMuIAoKYGBgCnBsaW5rIC0tYmZpbGUgcmVmXzFrZ19waGFzZTFfYWxsLzFrZ19waGFzZTFfcmF3IC0tZXhjbHVkZSByZWZfMWtnX3BoYXNlMV9hbGwvYWxsLjFrZy5hdGNnLnZhcmlhbnRzLnR4dCAtbWFrZS1iZWQgLS1vdXQgcmVmXzFrZ19waGFzZTFfYWxsLzFrZ19waGFzZTFfcmF3X25vX2F0Y2cKCnBsaW5rIC0tYmZpbGUgZHVtbXlfcHJvamVjdC9yYXdkYXRhIC0tZXhjbHVkZSByZWZfMWtnX3BoYXNlMV9hbGwvYWxsLjFrZy5hdGNnLnZhcmlhbnRzLnR4dCAtLW1ha2UtYmVkIC0tb3V0IGR1bW15X3Byb2plY3QvcmF3ZGF0YV8xa2dfcGhhc2UxX3Jhd19ub19hdGNnCmBgYAoKIyMjIyBNZXJnaW5nIGRhdGFzZXRzCgpUcnkgYW5kIG1lcmdlIHRoZSBkYXRhLgoKYGBgCnBsaW5rIC0tYmZpbGUgZHVtbXlfcHJvamVjdC9yYXdkYXRhXzFrZ19waGFzZTFfcmF3X25vX2F0Y2cgLS1ibWVyZ2UgcmVmXzFrZ19waGFzZTFfYWxsLzFrZ19waGFzZTFfcmF3X25vX2F0Y2cgLS1tYWtlLWJlZCAtLW91dCBkdW1teV9wcm9qZWN0L3Jhd2RhdGEuMWtnX3BoYXNlMQpgYGAKClRoZXJlIHByb2JhYmx5IGlzIGFuIGVycm9yIC4uLgoKYGBgCkVycm9yOiA3MiB2YXJpYW50cyB3aXRoIDMrIGFsbGVsZXMgcHJlc2VudC4KKiBJZiB5b3UgYmVsaWV2ZSB0aGlzIGlzIGR1ZSB0byBzdHJhbmQgaW5jb25zaXN0ZW5jeSwgdHJ5IC0tZmxpcCB3aXRoCiAgZHVtbXlfcHJvamVjdC9yYXdkYXRhLjFrZ19waGFzZTEtbWVyZ2UubWlzc25wLgogIChXYXJuaW5nOiBpZiB0aGUgc3Vic2VxdWVudCBtZXJnZSBzZWVtcyB0byB3b3JrLCBzdHJhbmQgZXJyb3JzIGludm9sdmluZyBTTlBzCiAgd2l0aCBBL1Qgb3IgQy9HIGFsbGVsZXMgcHJvYmFibHkgcmVtYWluIGluIHlvdXIgZGF0YS4gIElmIExEIGJldHdlZW4gbmVhcmJ5CiAgU05QcyBpcyBoaWdoLCAtLWZsaXAtc2NhbiBzaG91bGQgZGV0ZWN0IHRoZW0uKQoqIElmIHlvdSBhcmUgZGVhbGluZyB3aXRoIGdlbnVpbmUgbXVsdGlhbGxlbGljIHZhcmlhbnRzLCB3ZSByZWNvbW1lbmQgZXhwb3J0aW5nCiAgdGhhdCBzdWJzZXQgb2YgdGhlIGRhdGEgdG8gVkNGICh2aWEgZS5nLiAnLS1yZWNvZGUgdmNmJyksIG1lcmdpbmcgd2l0aAogIGFub3RoZXIgdG9vbC9zY3JpcHQsIGFuZCB0aGVuIGltcG9ydGluZyB0aGUgcmVzdWx0OyBQTElOSyBpcyBub3QgeWV0IHN1aXRlZAogIHRvIGhhbmRsaW5nIHRoZW0uClNlZSBodHRwczovL3d3dy5jb2ctZ2Vub21pY3Mub3JnL3BsaW5rLzEuOS9kYXRhI21lcmdlMyBmb3IgbW9yZSBkaXNjdXNzaW9uLgpgYGAKClNvIGxldCdzIGZsaXAgc29tZSB2YXJpYW50cy4KCmBgYApwbGluayAtLWJmaWxlIGR1bW15X3Byb2plY3QvcmF3ZGF0YSAtLWV4Y2x1ZGUgcmVmXzFrZ19waGFzZTFfYWxsL2FsbC4xa2cuYXRjZy52YXJpYW50cy50eHQgLS1mbGlwIGR1bW15X3Byb2plY3QvcmF3ZGF0YS4xa2dfcGhhc2UxLW1lcmdlLm1pc3NucCAtLW1ha2UtYmVkIC0tb3V0IGR1bW15X3Byb2plY3QvcmF3ZGF0YV8xa2dfcGhhc2UxX3Jhd19ub19hdGNnCmBgYAoKTGV0J3MgdHJ5IGFnYWluIGFuZCBtZXJnZSB0aGUgZGF0YS4KCmBgYApwbGluayAtLWJmaWxlIGR1bW15X3Byb2plY3QvcmF3ZGF0YV8xa2dfcGhhc2UxX3Jhd19ub19hdGNnIC0tYm1lcmdlIHJlZl8xa2dfcGhhc2UxX2FsbC8xa2dfcGhhc2UxX3Jhd19ub19hdGNnIC0tbWFrZS1iZWQgLS1vdXQgZHVtbXlfcHJvamVjdC9yYXdkYXRhLjFrZ19waGFzZTEKYGBgCgpUaGVyZSBzdGlsbCBpcyBhbiBlcnJvciAtLSB0aGVyZSBhcmUgYSBmZXcgbXVsdGktYWxsZWxpYyB2YXJpYW50cyBwcmVzZW50IHdoaWNoIGBQTElOS2AgY2FuJ3QgaGFuZGxlLiAKCmBgYApFcnJvcjogMTQgdmFyaWFudHMgd2l0aCAzKyBhbGxlbGVzIHByZXNlbnQuCiogSWYgeW91IGJlbGlldmUgdGhpcyBpcyBkdWUgdG8gc3RyYW5kIGluY29uc2lzdGVuY3ksIHRyeSAtLWZsaXAgd2l0aAogIGR1bW15X3Byb2plY3QvcmF3ZGF0YS4xa2dfcGhhc2UxLW1lcmdlLm1pc3NucC4KICAoV2FybmluZzogaWYgdGhlIHN1YnNlcXVlbnQgbWVyZ2Ugc2VlbXMgdG8gd29yaywgc3RyYW5kIGVycm9ycyBpbnZvbHZpbmcgU05QcwogIHdpdGggQS9UIG9yIEMvRyBhbGxlbGVzIHByb2JhYmx5IHJlbWFpbiBpbiB5b3VyIGRhdGEuICBJZiBMRCBiZXR3ZWVuIG5lYXJieQogIFNOUHMgaXMgaGlnaCwgLS1mbGlwLXNjYW4gc2hvdWxkIGRldGVjdCB0aGVtLikKKiBJZiB5b3UgYXJlIGRlYWxpbmcgd2l0aCBnZW51aW5lIG11bHRpYWxsZWxpYyB2YXJpYW50cywgd2UgcmVjb21tZW5kIGV4cG9ydGluZwogIHRoYXQgc3Vic2V0IG9mIHRoZSBkYXRhIHRvIFZDRiAodmlhIGUuZy4gJy0tcmVjb2RlIHZjZicpLCBtZXJnaW5nIHdpdGgKICBhbm90aGVyIHRvb2wvc2NyaXB0LCBhbmQgdGhlbiBpbXBvcnRpbmcgdGhlIHJlc3VsdDsgUExJTksgaXMgbm90IHlldCBzdWl0ZWQKICB0byBoYW5kbGluZyB0aGVtLgpTZWUgaHR0cHM6Ly93d3cuY29nLWdlbm9taWNzLm9yZy9wbGluay8xLjkvZGF0YSNtZXJnZTMgZm9yIG1vcmUgZGlzY3Vzc2lvbi4KYGBgCgpMZXQncyBqdXN0IHJlbW92ZSB0aGVzZSBtdWx0aS1hbGxlbGljIHZhcmlhbnRzLgoKYGBgCnBsaW5rIC0tYmZpbGUgZHVtbXlfcHJvamVjdC9yYXdkYXRhXzFrZ19waGFzZTFfcmF3X25vX2F0Y2cgLS1leGNsdWRlIGR1bW15X3Byb2plY3QvcmF3ZGF0YS4xa2dfcGhhc2UxLW1lcmdlLm1pc3NucCAtLW1ha2UtYmVkIC0tb3V0IGR1bW15X3Byb2plY3QvcmF3ZGF0YV8xa2dfcGhhc2UxX3Jhd19ub19hdGNnX2JpCmBgYAoKQWZ0ZXIgcmVtb3ZpbmcgdGhvc2UgcGVza3kgbXVsdGktYWxsZWxpYyB2YXJpYW50cywgd2Ugc2hvdWxkIGJlIGFibGUgdG8gbWVyZ2UgdGhlIGRhdGEuIFdlIHNob3VsZCB0YWtlIG9mIHRoZSBmb2xsb3dpbmc6CgotIGV4dHJhY3QgdGhlIHBydW5lZCBTTlAtc2V0IChyZW1lbWJlcj8pLCBgLS1leHRyYWN0IHJhd2RhdGEvcmF3LUdXQS1kYXRhLnBydW5lLmlgLCAKLSBleGNsdWRlIG5vbi1hdXRvc29tYWwgdmFyaWFudHMsIGAtLWF1dG9zb21lYCwgCi0gYW5kIG9ubHkga2VlcGluZyBoaWdoLXF1YWxpdHkgZGF0YSwgYC0tbWFmIDAuMTAgLS1nZW5vIDAuMTAgLS1od2UgMWUtM2AsIAo8IS0tIFRISVMgQ0hVTksgQ09VTEQgQkUgVVNFRCBUTyBSRU1PVkUgRFVQTElDQVRFUywgQlVUIElUIERPRVNOJ1QgV09SSyBJTiBQTElOSyAxLjkgLS0+CjwhLS0gLSByZW1vdmUgbm9uLWZvdW5kZXJzIGZyb20gdGhlIDEwMDBHIGRhdGEsIGAtLWtlZXAtZm91bmRlcnNgLCAtLT4KPCEtLSAtIHJlbW92ZSBhbnkgZHVwbGljYXRlIHZhcmlhbnRzIGJhc2VkIG9uIFNOUElELCBgLS1ybS1kdXAgZm9yY2UtZmlyc3RgIC0tPgo8IS0tIC0gYW5kIGxpc3QgYW55IGR1cGxpY2F0ZSB2YXJpYW50cyBiYXNlZCBvbiBjaHJvbW9zb21hbCBiYXNlIHBhaXIgcG9zaXRpb24sIGAtLWxpc3QtZHVwbGljYXRlLXZhcnNgIC0tPgoKYGBgCnBsaW5rIC0tYmZpbGUgZHVtbXlfcHJvamVjdC9yYXdkYXRhXzFrZ19waGFzZTFfcmF3X25vX2F0Y2dfYmkgXAotLWJtZXJnZSByZWZfMWtnX3BoYXNlMV9hbGwvMWtnX3BoYXNlMV9yYXdfbm9fYXRjZyBcCi0tYXV0b3NvbWUgXAotLW1hZiAwLjEwIC0tZ2VubyAwLjEwIC0taHdlIDFlLTMgXAotLWV4dHJhY3QgcmF3ZGF0YS9yYXctR1dBLWRhdGEucHJ1bmUuaW4gXAotLW1ha2UtYmVkIC0tb3V0IGR1bW15X3Byb2plY3QvcmF3ZGF0YS4xa2dfcGhhc2UxLmNsZWFuCmBgYAoKPCEtLSBUSElTIENIVU5LIENPVUxEIEJFIFVTRUQgVE8gUkVNT1ZFIERVUExJQ0FURVMsIEJVVCBJVCBET0VTTidUIFdPUksgSU4gUExJTksgMS45IC0tPgo8IS0tIGBgYCAtLT4KPCEtLSBwbGluayAtLWJmaWxlIGR1bW15X3Byb2plY3QvcmF3ZGF0YV8xa2dfcGhhc2UxX3Jhd19ub19hdGNnX2JpIFwgLS0+CjwhLS0gLS1ibWVyZ2UgcmVmXzFrZ19waGFzZTFfYWxsLzFrZ19waGFzZTFfcmF3X25vX2F0Y2cgXCAtLT4KPCEtLSAtLWF1dG9zb21lIFwgLS0+CjwhLS0gLS1tYWYgMC4xMCAtLWdlbm8gMC4xMCAtLWh3ZSAxZS0zIFwgLS0+CjwhLS0gLS1leHRyYWN0IHJhd2RhdGEvcmF3LUdXQS1kYXRhLnBydW5lLmluIFwgLS0+CjwhLS0gLS1saXN0LWR1cGxpY2F0ZS12YXJzIFwgLS0+CjwhLS0gLS1tYWtlLWJlZCAtLW91dCBkdW1teV9wcm9qZWN0L3Jhd2RhdGEuMWtnX3BoYXNlMS5wcnVuZWQgLS0+CjwhLS0gYGBgIC0tPgoKPCEtLSBgYGAgLS0+CjwhLS0gcGxpbmsgLS1iZmlsZSBkdW1teV9wcm9qZWN0L3Jhd2RhdGEuMWtnX3BoYXNlMS5wcnVuZWQgXCAtLT4KPCEtLSAtLWV4Y2x1ZGUgZHVtbXlfcHJvamVjdC9yYXdkYXRhLjFrZ19waGFzZTEucHJ1bmVkLmR1cHZhciBcIC0tPgo8IS0tIC0tcm0tZHVwIGZvcmNlLWZpcnN0IFwgLS0+CjwhLS0gLS1tYWtlLWJlZCAtLW91dCBkdW1teV9wcm9qZWN0L3Jhd2RhdGEuMWtnX3BoYXNlMS5jbGVhbiAtLT4KPCEtLSBgYGAgLS0+CgpCZWZvcmUgd2UgY29udGludWUgaXQncyBiZXN0IHRvIGNsZWFuIHVwIGEgYml0IG9mIHRoZSBtZXNzLiAKCmBgYApybSAtZnYgZHVtbXlfcHJvamVjdC9yYXdkYXRhXzFrZ19waGFzZTFfcmF3X25vX2F0Y2dfYmkqIHJlZl8xa2dfcGhhc2UxX2FsbC8xa2dfcGhhc2UxX3Jhd19ub19hdGNnKiBkdW1teV9wcm9qZWN0L3Jhd2RhdGEuMWtnX3BoYXNlMS5wcnVuZWQqIGR1bW15X3Byb2plY3QvcmF3ZGF0YV8xa2dfcGhhc2UxX3Jhd19ub19hdGNnKiBkdW1teV9wcm9qZWN0L3Jhd2RhdGEuMWtnX3BoYXNlMS1tZXJnZSogZHVtbXlfcHJvamVjdC9yYXdkYXRhLjFrZ19waGFzZTEuYmVkIGR1bW15X3Byb2plY3QvcmF3ZGF0YS4xa2dfcGhhc2UxLmJpbSBkdW1teV9wcm9qZWN0L3Jhd2RhdGEuMWtnX3BoYXNlMS5mYW0gZHVtbXlfcHJvamVjdC9yYXdkYXRhLjFrZ19waGFzZTEuaGggZHVtbXlfcHJvamVjdC9yYXdkYXRhLjFrZ19waGFzZTEubG9nIHJlZl8xa2dfcGhhc2UxX2FsbC8xa2dfcGhhc2UxX3Jhdy4qCmBgYAoKTm93IHdlIGhhdmUgcHJlcGFyZWQgb3VyIGRhdGFzZXQgd2l0aCBvbmx5IGhpZ2gtcXVhbGl0eSBTTlBzIHRoYXQgaGF2ZSBmZXcgbWlzc2luZyBkYXRhLCB0aGF0IGFyZSBoaWdoLWZyZXF1ZW50LCBleGNsdWRlIHByb2JsZW1hdGljIGdlbm9taWMgcmFuZ2VzLCBhbmQgbWVyZ2VkIHRvIHRoZSAxMDAwRyBwaGFzZSAxIHJlZmVyZW5jZSBkYXRhc2V0LiBZb3VyIG91dHB1dCBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgoKYGBgClBMSU5LIHYxLjkwYjcuMiA2NC1iaXQgKDExIERlYyAyMDIzKSAgICAgICAgICAgd3d3LmNvZy1nZW5vbWljcy5vcmcvcGxpbmsvMS45LwooQykgMjAwNS0yMDIzIFNoYXVuIFB1cmNlbGwsIENocmlzdG9waGVyIENoYW5nICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMKTG9nZ2luZyB0byBkdW1teV9wcm9qZWN0L3Jhd2RhdGEuMWtnX3BoYXNlMS5jbGVhbi5sb2cuCk9wdGlvbnMgaW4gZWZmZWN0OgogIC0tYXV0b3NvbWUKICAtLWJmaWxlIGR1bW15X3Byb2plY3QvcmF3ZGF0YV8xa2dfcGhhc2UxX3Jhd19ub19hdGNnX2JpCiAgLS1ibWVyZ2UgcmVmXzFrZ19waGFzZTFfYWxsLzFrZ19waGFzZTFfcmF3X25vX2F0Y2cKICAtLWV4dHJhY3QgcmF3ZGF0YS9yYXctR1dBLWRhdGEucHJ1bmUuaW4KICAtLWdlbm8gMC4xMAogIC0taHdlIDFlLTMKICAtLW1hZiAwLjEwCiAgLS1tYWtlLWJlZAogIC0tb3V0IGR1bW15X3Byb2plY3QvcmF3ZGF0YS4xa2dfcGhhc2UxLmNsZWFuCgoxNjM4NCBNQiBSQU0gZGV0ZWN0ZWQ7IHJlc2VydmluZyA4MTkyIE1CIGZvciBtYWluIHdvcmtzcGFjZS4KMjAwMCBwZW9wbGUgbG9hZGVkIGZyb20gZHVtbXlfcHJvamVjdC9yYXdkYXRhXzFrZ19waGFzZTFfcmF3X25vX2F0Y2dfYmkuZmFtLgoxMDkyIHBlb3BsZSB0byBiZSBtZXJnZWQgZnJvbSByZWZfMWtnX3BoYXNlMV9hbGwvMWtnX3BoYXNlMV9yYXdfbm9fYXRjZy5mYW0uCk9mIHRoZXNlLCAxMDkyIGFyZSBuZXcsIHdoaWxlIDAgYXJlIHByZXNlbnQgaW4gdGhlIGJhc2UgZGF0YXNldC4KV2FybmluZzogTXVsdGlwbGUgcG9zaXRpb25zIHNlZW4gZm9yIHZhcmlhbnQgJ3JzMzkzNDgzNCcuCldhcm5pbmc6IE11bHRpcGxlIHBvc2l0aW9ucyBzZWVuIGZvciB2YXJpYW50ICdyczM3Mzc3MjgnLgpXYXJuaW5nOiBNdWx0aXBsZSBwb3NpdGlvbnMgc2VlbiBmb3IgdmFyaWFudCAncnM2Njg3Nzc2Jy4KV2FybmluZzogTXVsdGlwbGUgY2hyb21vc29tZXMgc2VlbiBmb3IgdmFyaWFudCAncnMxMDUwMzAxJy4KV2FybmluZzogTXVsdGlwbGUgY2hyb21vc29tZXMgc2VlbiBmb3IgdmFyaWFudCAncnM0ODUwJy4KMzE3NDc2IG1hcmtlcnMgbG9hZGVkIGZyb20gZHVtbXlfcHJvamVjdC9yYXdkYXRhXzFrZ19waGFzZTFfcmF3X25vX2F0Y2dfYmkuYmltLgozMTIyMzkgbWFya2VycyB0byBiZSBtZXJnZWQgZnJvbSByZWZfMWtnX3BoYXNlMV9hbGwvMWtnX3BoYXNlMV9yYXdfbm9fYXRjZy5iaW0uCk9mIHRoZXNlLCAxNCBhcmUgbmV3LCB3aGlsZSAzMTIyMjUgYXJlIHByZXNlbnQgaW4gdGhlIGJhc2UgZGF0YXNldC4KMzEyMTkwIG1vcmUgbXVsdGlwbGUtcG9zaXRpb24gd2FybmluZ3M6IHNlZSBsb2cgZmlsZS4KUGVyZm9ybWluZyBzaW5nbGUtcGFzcyBtZXJnZSAoMzA5MiBwZW9wbGUsIDMwODMxNyB2YXJpYW50cykuCk1lcmdlZCBmaWxlc2V0IHdyaXR0ZW4gdG8gZHVtbXlfcHJvamVjdC9yYXdkYXRhLjFrZ19waGFzZTEuY2xlYW4tbWVyZ2UuYmVkICsKZHVtbXlfcHJvamVjdC9yYXdkYXRhLjFrZ19waGFzZTEuY2xlYW4tbWVyZ2UuYmltICsKZHVtbXlfcHJvamVjdC9yYXdkYXRhLjFrZ19waGFzZTEuY2xlYW4tbWVyZ2UuZmFtIC4KMzA4MzE3IHZhcmlhbnRzIGxvYWRlZCBmcm9tIC5iaW0gZmlsZS4KMzA5MiBwZW9wbGUgKDE1MjIgbWFsZXMsIDE1NzAgZmVtYWxlcykgbG9hZGVkIGZyb20gLmZhbS4KMzA5MiBwaGVub3R5cGUgdmFsdWVzIGxvYWRlZCBmcm9tIC5mYW0uCi0tZXh0cmFjdDogNDk4NTYgdmFyaWFudHMgcmVtYWluaW5nLgpVc2luZyAxIHRocmVhZCAobm8gbXVsdGl0aHJlYWRlZCBjYWxjdWxhdGlvbnMgaW52b2tlZCkuCkJlZm9yZSBtYWluIHZhcmlhbnQgZmlsdGVycywgMzA3OCBmb3VuZGVycyBhbmQgMTQgbm9uZm91bmRlcnMgcHJlc2VudC4KQ2FsY3VsYXRpbmcgYWxsZWxlIGZyZXF1ZW5jaWVzLi4uIGRvbmUuClRvdGFsIGdlbm90eXBpbmcgcmF0ZSBpcyAwLjk5NDg2Ny4KMjk5IHZhcmlhbnRzIHJlbW92ZWQgZHVlIHRvIG1pc3NpbmcgZ2Vub3R5cGUgZGF0YSAoLS1nZW5vKS4KLS1od2U6IDEzODI1IHZhcmlhbnRzIHJlbW92ZWQgZHVlIHRvIEhhcmR5LVdlaW5iZXJnIGV4YWN0IHRlc3QuCjI2MTcgdmFyaWFudHMgcmVtb3ZlZCBkdWUgdG8gbWlub3IgYWxsZWxlIHRocmVzaG9sZChzKQooLS1tYWYvLS1tYXgtbWFmLy0tbWFjLy0tbWF4LW1hYykuCjMzMTE1IHZhcmlhbnRzIGFuZCAzMDkyIHBlb3BsZSBwYXNzIGZpbHRlcnMgYW5kIFFDLgpQaGVub3R5cGUgZGF0YSBpcyBxdWFudGl0YXRpdmUuCi0tbWFrZS1iZWQgdG8gZHVtbXlfcHJvamVjdC9yYXdkYXRhLjFrZ19waGFzZTEuY2xlYW4uYmVkICsKZHVtbXlfcHJvamVjdC9yYXdkYXRhLjFrZ19waGFzZTEuY2xlYW4uYmltICsKZHVtbXlfcHJvamVjdC9yYXdkYXRhLjFrZ19waGFzZTEuY2xlYW4uZmFtIC4uLiBkb25lLgpgYGAKClNvIGluIHRvdGFsIHRoZXJlIGFyZSAzLDA5MiBpbmRpdmlkdWFscywgMSw1MjIgbWFsZXMgYW5kIDEsNTcwIGZlbWFsZXMsIGFuZCAzLDA3OCBmb3VuZGVycyBhbmQgMTQgbm9uLWZvdW5kZXJzLiBUaGUgdG90YWwgZ2Vub3R5cGluZyByYXRlIGlzIDk5LjUlIGFuZCAzMywxMTUgdmFyaWFudHMgYXJlIHByZXNlbnQuCgoKIyMjIFByaW5jaXBhbCBjb21wb25lbnQgYW5hbHlzaXMKCkdyZWF0LCB3ZSd2ZSBwcmVwYXJlZCBvdXIgZHVtbXkgcHJvamVjdCBkYXRhIGFuZCBtZXJnZWQgdGhpcyB3aXRoIDEwMDBHIHBoYXNlIDEuIExldCdzIGV4ZWN1dGUgdGhlIFBDQSB1c2luZyBgLS1wY2FgIGluIGBQTElOS2AuCgpgYGAKcGxpbmsgLS1iZmlsZSBkdW1teV9wcm9qZWN0L3Jhd2RhdGEuMWtnX3BoYXNlMS5jbGVhbiAtLXBjYSAtLW91dCBkdW1teV9wcm9qZWN0L3Jhd2RhdGEuMWtnX3BoYXNlMS5jbGVhbgpgYGAKCiMjIyBQbG90dGluZyB0aGUgUENBIHJlc3VsdHMKCklmIGFsbCBpcyBwZWFjaHksIHlvdSBqdXN0IHN1Y2Nlc2Z1bGx5IHJhbiBQQ0EgYWdhaW5zdCAxMDAwRyBwaGFzZSAxLiBVc2luZyBgLS1wY2FgIHdlIGhhdmUgY2FsY3VsYXRlZCBwcmluY2lwYWwgY29tcG9uZW50cyAoUENzKSwgMjAgaW4gdG90YWwgYnkgZGVmYXVsdCwgYW5kIHdlIGNhbiBub3cgc3RhcnQgcGxvdHRpbmcgdGhlbS4gTGV0J3MgY3JlYXRlIGEgc2NhdHRlciBkaWFncmFtIG9mIHRoZSBmaXJzdCB0d28gcHJpbmNpcGFsIGNvbXBvbmVudHMsIGluY2x1ZGluZyBhbGwgaW5kaXZpZHVhbHMgaW4gdGhlIGZpbGUgYHJhd2RhdGEuMWtnX3BoYXNlMS5jbGVhbi5laWdlbnZlY2AgKHRoZSBmaXJzdCBhbmQgc2Vjb25kIHByaW5jaXBhbCBjb21wb25lbnRzIGFyZSBjb2x1bW5zIDMgYW5kIDQsIHJlc3BlY3RpdmVseSkuIFdlIG5lZWQgdG8gY29sbGVjdCBzb21lIHBlci1zYW1wbGUgaW5mb3JtYXRpb24gdG8gY29sb3IgdGhlIHBvaW50cyBhY2NvcmRpbmcgdG8gc2FtcGxlIG9yaWdpbi4gCgpGaXJzdCB3ZSBjb2xsZWN0IHRoZSByZXN1bHRzIGZyb20gdGhlIGAtLXBjYWAsIHRoZSBkdW1teSBkYXRhIHBoZW5vdHlwZSBpbmZvcm1hdGlvbiwgYW5kIHRoZSByZWZlcmVuY2UgcG9wdWxhdGlvbiBpbmZvcm1hdGlvbi4KCgoKCgoKCgoKCgoKRGVyaXZlIFBDMSBhbmQgUEMyIHRocmVzaG9sZHMgc28gdGhhdCBvbmx5IGluZGl2aWR1YWxzIHdobyBtYXRjaCB0aGUgZ2l2ZW4gYW5jZXN0cmFsIHBvcHVsYXRpb24gYXJlIGluY2x1ZGVkLiBGb3IgcG9wdWxhdGlvbnMgb2YgRXVyb3BlYW4gZGVzY2VudCwgdGhpcyB3aWxsIGJlIGVpdGhlciB0aGUgQ0VVIG9yIFRTSSAxMDAwRyBpbmRpdmlkdWFscyAoRmlndXJlIFxAcmVmKGZpZzpzaG93cGNhMWtnKSkuIEhlcmUsIHdlIGNob3NlIHRvIGV4Y2x1ZGUgYWxsIGluZGl2aWR1YWxzIHdpdGggYSBmaXJzdCBwcmluY2lwYWwgY29tcG9uZW50IHNjb3JlIGxlc3MgdGhhbiBgMC4wMDIzYC4gCgpXcml0ZSB0aGUgRklEIGFuZCBJSUQgb2YgdGhlc2UgaW5kaXZpZHVhbHMgdG8gYSBmaWxlIGNhbGxlZCBgZmFpbC1hbmNlc3RyeS1RQy50eHRgLgoKYGBgCmNhdCBkdW1teV9wcm9qZWN0L3Jhd2RhdGEuMWtnX3BoYXNlMS5jbGVhbi5laWdlbnZlYyB8IFwKYXdrICckMyA8IDAuMDAyMycgfCBhd2sgJ3sgcHJpbnQgJDEsICQyIH0nID4gZHVtbXlfcHJvamVjdC9mYWlsLWFuY2VzdHJ5LVFDLnR4dApgYGAKCkNob29zaW5nIHdoaWNoIHRocmVzaG9sZHMgdG8gYXBwbHkgKGFuZCB0aHVzIHdoaWNoIGluZGl2aWR1YWxzIHRvIHJlbW92ZSkgaXMgbm90IGEgc3RyYWlnaHRmb3J3YXJkIHByb2Nlc3MuIFRoZSBrZXkgaXMgdG8gcmVtb3ZlIHRob3NlIGluZGl2aWR1YWxzIHdpdGggZ3JlYXRseSBkaXZlcmdlbnQgYW5jZXN0cnksIGFzIHRoZXNlIHNhbXBsZXMgaW50cm9kdWNlIHRoZSBtb3N0IGJpYXMgdG8gdGhlIHN0dWR5LiBJZGVudGlmaWNhdGlvbiBvZiBtb3JlIGZpbmUtc2NhbGUgYW5jZXN0cnkgY2FuIGJlIGNvbmR1Y3RlZCBieSB1c2luZyBsZXNzIGRpdmVyZ2VudCByZWZlcmVuY2Ugc2FtcGxlcyAoX2UuZy5fLCB3aXRoaW4gRXVyb3BlLCBzdHJhdGlmaWNhdGlvbiBjb3VsZCBiZSBpZGVudGlmaWVkIHVzaW5nIHRoZSBDRVUsIFRTSSAoSXRhbGlhbiksIEdCUiAoQnJpdGlzaCksIEZJTiAoRmlubmlzaCkgYW5kIElCUyAoSWJlcmlhbikgc2FtcGxlcyBmcm9tIHRoZSAxLDAwMCBHZW5vbWVzIFByb2plY3QgKGh0dHA6Ly93d3cuMTAwMGdlbm9tZXMub3JnLykpLiBSb2J1c3QgaWRlbnRpZmljYXRpb24gb2YgZmluZS1zY2FsZSBwb3B1bGF0aW9uIHN0cnVjdHVyZSBvZnRlbiByZXF1aXJlcyB0aGUgY29uc3RydWN0aW9uIG9mIG1hbnkgKDLigJMxMCkgcHJpbmNpcGFsIGNvbXBvbmVudHMuCgo8ZGl2IGNsYXNzPSJmaWd1cmUiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPgo8aW1nIHNyYz0iaW1nL19nd2FzX2R1bW15L2d3YXMtcWMtcGNhLTEwMDBnLnBuZyIgYWx0PSJQQ0EgLSBZb3VyIGRhdGEgdnMuIDEwMDBnLiIgd2lkdGg9Ijg1JSIgLz4KPHAgY2xhc3M9ImNhcHRpb24iPihcI2ZpZzpzaG93cGNhMWtnKVBDQSAtIFlvdXIgZGF0YSB2cy4gMTAwMGcuPC9wPgo8L2Rpdj4KCgojIyBSZW1vdmluZyBzYW1wbGVzCgpGaW5hbGx5ISBXZSBoYXZlIGEgbGlzdCBvZiBzYW1wbGVzIG9mIHBvb3IgcXVhbGl0eSBvciBkaXZlcmdlbnQgYW5jZXN0cnksIGFuZCBkdXBsaWNhdGVkIG9yIHJlbGF0ZWQgc2FtcGxlcy4gV2Ugc2hvdWxkIHJlbW92ZSB0aGVzZS4gTGV0J3MgY29sbGVjdCBhbGwgSURzIGZyb20gb3VyIGBmYWlsLSpgLWZpbGVzIGludG8gYSBzaW5nbGUgZmlsZS4KCmBgYApjYXQgZHVtbXlfcHJvamVjdC9mYWlsLSogfCBzb3J0IC1rMSB8IHVuaXEgPiBkdW1teV9wcm9qZWN0L2ZhaWwtcWMtaW5kcy50eHQKYGBgCgpUaGlzIG5ldyBmaWxlIHNob3VsZCBub3cgY29udGFpbiBhIGxpc3Qgb2YgdW5pcXVlIGluZGl2aWR1YWxzIGZhaWxpbmcgdGhlIHByZXZpb3VzIFFDIHN0ZXBzIHdoaWNoIHdlIHdhbnQgdG8gcmVtb3ZlLgoKYGBgCnBsaW5rIC0tYmZpbGUgZHVtbXlfcHJvamVjdC9yYXdkYXRhIC0tcmVtb3ZlIGR1bW15X3Byb2plY3QvZmFpbC1xYy1pbmRzLnR4dCAtLW1ha2UtYmVkIC0tb3V0IGR1bW15X3Byb2plY3QvY2xlYW5faW5kc19kYXRhCmBgYAoKPiBRdWVzdGlvbjogSG93IG1hbnkgdmFyaWFudHMgYW5kIHNhbXBsZXMgYXJlIGxlZnQ/IEhvdyBtYW55IGNhc2VzIGFuZCBob3cgbWFueSBjb250cm9scyBkaWQgeW91IGxvb3NlPyAKCiMjIFRoZSBuZXh0IHN0ZXAKCk5vdyB0aGF0IHlvdSBmaWx0ZXJlZCBzYW1wbGVzLCB3ZSBzaG91bGQgdHVybiBvdXIgYXR0ZW50aW9uIHRvIHN0ZXAgMiBvZiB0aGUgUUMgZm9yIEdXQVM6IGlkZW50aWZ5IFNOUHMgb2YgcG9vciBxdWFsaXR5IGluIENoYXB0ZXIgXEByZWYoZ3dhc19iYXNpY3Nfc25wX3FjKS4KCjwhLS0gYGBge2pzLCBlY2hvID0gRkFMU0V9IC0tPgo8IS0tIHRpdGxlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFkZXInKTsgLS0+CjwhLS0gdGl0bGUuaW5uZXJIVE1MID0gJzxpbWcgc3JjPSJpbWcvX2hlYWRlcnMvZ3dhc19zYW1wbGVfcWMucG5nIiBhbHQ9IkdXQVMgYmFzaWNzOiBTYW1wbGUgUUMiPicgKyB0aXRsZS5pbm5lckhUTUwgLS0+CjwhLS0gYGBgIC0tPgoKPCEtLWNoYXB0ZXI6ZW5kOjAzXzJfZ3dhc19iYXNpY3Nfc2FtcGxlX3FjLlJtZC0tPgoKIyBQZXItU05QIFFDIHsjZ3dhc19iYXNpY3Nfc25wX3FjfQo8IS0tICFbXSguL2ltZy9fZ3dhc19kdW1teS9nd2FzX3NucF9xYy5wbmcpe3dpZHRoPTcwJX0gLS0+CgoKCgoKCk5vdyB0aGF0IHdlIHJlbW92ZWQgc2FtcGxlcywgd2UgY2FuIGZvY3VzIG9uIGxvdy1xdWFsaXR5IHZhcmlhbnRzLgoKIyMgU05QIGNhbGwgcmF0ZXMKCldlIHN0YXJ0IGJ5IGNhbGN1bGF0aW5nIHRoZSBtaXNzaW5nIGdlbm90eXBlIHJhdGUgZm9yIGVhY2ggU05QLCBpbiBvdGhlciB3b3JkcyB0aGUgcGVyLVNOUCBjYWxsIHJhdGUuCgpgYGAKcGxpbmsgLS1iZmlsZSBkdW1teV9wcm9qZWN0L2NsZWFuX2luZHNfZGF0YSAtLW1pc3NpbmcgLS1vdXQgZHVtbXlfcHJvamVjdC9jbGVhbl9pbmRzX2RhdGEKYGBgCgpMZXQncyB2aXN1YWxpemUgdGhlIHJlc3VsdHMgdG8gaWRlbnRpZnkgYSB0aHJlc2hvbGQgZm9yIGV4dHJlbWUgZ2Vub3R5cGUgZmFpbHVyZSByYXRlLiBXZSBjaG9zZSBhIGNhbGxyYXRlIHRocmVzaG9sZCBvZiAzJSwgYnV0IGl0J3MgYXJiaXRyYXJ5IGFuZCBkZXBlbmRpbmcgb24gdGhlIGRhdGFzZXQsIHRoZSBkYXRhICh2aXN1YWxpemF0aW9uKSwgYW5kIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyAoRmlndXJlIFxAcmVmKGZpZzpzaG93c25wY2FsbHJhdGUpKS4KCgoKCgoKPGRpdiBjbGFzcz0iZmlndXJlIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj4KPGltZyBzcmM9ImltZy9fZ3dhc19kdW1teS9zaG93LXNucC1jYWxscmF0ZS5wbmciIGFsdD0iUGVyIFNOUCBjYWxsIHJhdGUuIiB3aWR0aD0iODUlIiAvPgo8cCBjbGFzcz0iY2FwdGlvbiI+KFwjZmlnOnNob3dzbnBjYWxscmF0ZSlQZXIgU05QIGNhbGwgcmF0ZS48L3A+CjwvZGl2PgoKIyMgRGlmZmVyZW50aWFsIFNOUCBjYWxsIHJhdGVzCgpUaGVyZSBjb3VsZCBhbHNvIGJlIGRpZmZlcmVuY2VzIGluIGdlbm90eXBlIGNhbGwgcmF0ZXMgYmV0d2VlbiBjYXNlcyBhbmQgY29udHJvbHMuIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRvIGNoZWNrIGZvciB0aGlzIGJlY2F1c2UgdGhlc2UgZGlmZmVyZW5jZXMgY291bGQgbGVhZCB0byBzcHVyaW91cyBhc3NvY2lhdGlvbnMuIFdlIGNhbiB0ZXN0IGFsbCBtYXJrZXJzIGZvciBkaWZmZXJlbmNlcyBpbiBjYWxsIHJhdGUgYmV0d2VlbiBjYXNlcyBhbmQgY29udHJvbHMsIG9yIGJhc2VkIG9uIG90aGVyIGNyaXRlcmlhLgoKYGBgCnBsaW5rIC0tYmZpbGUgZHVtbXlfcHJvamVjdC9jbGVhbl9pbmRzX2RhdGEgLS10ZXN0LW1pc3NpbmcgLS1vdXQgZHVtbXlfcHJvamVjdC9jbGVhbl9pbmRzX2RhdGEKYGBgCgpMZXQncyBjb2xsZWN0IGFsbCB0aGUgU05QcyB3aXRoIGEgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgKFAgPCAwLjAwMDAxKSBtaXNzaW5nIGRhdGEgcmF0ZSBiZXR3ZWVuIGNhc2VzIGFuZCBjb250cm9scy4KCmBgYApjYXQgZHVtbXlfcHJvamVjdC9jbGVhbl9pbmRzX2RhdGEubWlzc2luZyB8IGF3ayAnJDUgPCAwLjAwMDAxJyB8IGF3ayAneyBwcmludCAkMiB9JyA+IGR1bW15X3Byb2plY3QvZmFpbC1kaWZmbWlzcy1xYy50eHQKYGBgCgojIyBBbGxlbGUgZnJlcXVlbmNpZXMKCldlIHNob3VsZCBhbHNvIGdldCBhbiBpZGVhIG9uIHdoYXQgdGhlIGFsbGVsZSBmcmVxdWVuY2llcyBhcmUgaW4gb3VyIGRhdGFzZXQuIExvdyBmcmVxdWVudCBTTlBzIHNob3VsZCBwcm9iYWJseSBiZSBleGNsdWRlZCwgYXMgdGhlc2UgYXJlIHVuaW5mb3JtYXRpdmUgd2hlbiBtb25vbW9ycGhpYyAoYWxsZWxlIGZyZXF1ZW5jeSA9IDApLCBvciB0aGV5IG1heSBsZWFkIHRvIHNwdXJpb3VzIGFzc29jaWF0aW9ucy4KCmBgYApwbGluayAtLWJmaWxlIGR1bW15X3Byb2plY3QvY2xlYW5faW5kc19kYXRhIC0tZnJlcSAtLW91dCBkdW1teV9wcm9qZWN0L2NsZWFuX2luZHNfZGF0YQpgYGAKCkxldCdzIGFsc28gcGxvdCB0aGVzZSBkYXRhLiBZb3UgY2FuIHZpZXcgdGhlIHJlc3VsdCBiZWxvdywgYW5kIHRyeSBpdCB5b3Vyc2VsZiAoRmlndXJlIFxAcmVmKGZpZzpzaG93ZnJlcSkpLgoKCgoKCjxkaXYgY2xhc3M9ImZpZ3VyZSIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+CjxpbWcgc3JjPSJpbWcvX2d3YXNfZHVtbXkvc2hvdy1mcmVxLnBuZyIgYWx0PSJNaW5vciBhbGxlbGUgZnJlcXVlbmN5LiIgd2lkdGg9Ijg1JSIgLz4KPHAgY2xhc3M9ImNhcHRpb24iPihcI2ZpZzpzaG93ZnJlcSlNaW5vciBhbGxlbGUgZnJlcXVlbmN5LjwvcD4KPC9kaXY+CgojIyMgQSBub3RlIG9uIGFsbGVsZSBjb2RpbmcKCk9oLCBvbmUgbW9yZSB0aGluZyBhYm91dCBhbGxlbGVzLiAKCmBQTElOS2AgY29kZXMgYWxsZWxlcyBhcyBmb2xsb3dzOgoKQTEgPSBtaW5vciBhbGxlbGUsIHRoZSBsZWFzdCBmcmVxdWVudCBhbGxlbGUKQTIgPSBtYWpvciBhbGxlbGUsIHRoZSBtb3N0IGZyZXF1ZW50IGFsbGVsZQoKQW5kIHdoZW4geW91IHVzZSBgUExJTktgIHRoZSBmbGFnIGAtLWZyZXFgIG9yIGAtLW1hZmAgaXMgYWx3YXlzIHJlbGF0aXZlIHRvIHRoZSBBMS1hbGxlbGUsIGFzIGlzIHRoZSBvZGRzIHJhdGlvIChPUikgb3IgZWZmZWN0IHNpemUgKGJldGEpLgoKSG93ZXZlciwgYFNOUFRFU1RgIG1ha2VzIHVzZSBvZiB0aGUgc28tY2FsbGVkIE9YRk9SRC1mb3JtYXQsIHRoaXMgY29kZXMgYWxsZWxlcyBhcyBmb2xsb3dzOgoKQSA9IHRoZSAnb3RoZXInIGFsbGVsZQpCID0gdGhlICdjb2RlZCcgYWxsZWxlCgpXaGVuIHlvdSB1c2UgYFNOUFRFU1RgIGl0IHdpbGwgcmVwb3J0IHRoZSBhbGxlbGUgZnJlcXVlbmN5IGFzIGBDQUZgLCBpbiBvdGhlciB3b3JkcyB0aGUgX2NvZGVkIGFsbGVsZSBmcmVxdWVuY3lfLCBhbmQgdGhlIGVmZmVjdCBzaXplIChiZXRhKSBpcyBhbHdheXMgcmVsYXRpdmUgdG8gdGhlIEItYWxsZWxlLiBUaGlzIG1lYW5zLCBgQ0FGYCBfY291bGRfIGJlIHRoZSBgTUFGYCwgb3IgX21pbm9yIGFsbGVsZSBmcmVxdWVuY3lfLCBidXQgdGhpcyBpcyAqKm5vdCoqIGEgZ2l2ZW4uCgpJbiBvdGhlciB3b3JkcywgYWx3YXlzIG1ha2Ugc3VyZSB3aGF0IHRoZSBhbGxlbGUtY29kaW5nIG9mIGEgZ2l2ZW4gcHJvZ3JhbSwgYmUgaXQgYFBMSU5LYCwgYFNOUFRFU1RgLCBgR0NUQWAsIF9ldCBjZXRlcmFfLCBpcyEgSSBjYW5ub3Qgc3RyZXNzIHRoaXMgZW5vdWdoLiBBc2sgeW91cnNlbGY6ICd3aGF0IGlzIHRoZSBhbGxlbGUgZnJlcXVlbmN5IHJlZmVycmluZyB0bz8nLCAndGhlIGVmZmVjdCBzaXplIGlzIHJlbGF0aXZlIHRvLi4uPycuCgpSaWdodCwgbGV0J3MgY29udGludWUuCgojIyBIYXJkeS1XZWluYmVyZyBFcXVpbGlicml1bQoKQmVjYXVzZSB3ZSBhcmUgcGVyZm9ybWluZyBhIGNhc2UtY29udHJvbCBnZW5vbWUtd2lkZSBhc3NvY2lhdGlvbiBzdHVkeSwgd2UgcHJvYmFibHkgZXhwZWN0IHNvbWUgZGlmZmVyZW5jZXMgaW4gSGFyZHktV2VpbmJlcmcgRXF1aWxpYnJpdW0gKEhXRSksIGJ1dCBleHRyZW1lIGRldmlhdGlvbnMgYXJlIHByb2JhYmx5IGluZGljYXRpdmUgb2YgZ2Vub3R5cGluZyBlcnJvcnMuCgpgYGAKcGxpbmsgLS1iZmlsZSBkdW1teV9wcm9qZWN0L2NsZWFuX2luZHNfZGF0YSAtLWhhcmR5IC0tb3V0IGR1bW15X3Byb2plY3QvY2xlYW5faW5kc19kYXRhCmBgYAoKTGV0J3MgYWxzbyBwbG90IHRoZXNlIGRhdGEuIFlvdSBjYW4gdmlldyB0aGUgcmVzdWx0IGJlbG93LCBhbmQgdHlwZSBvdmVyIHRoZSBjb2RlIHRvIGRvIGl0IHlvdXJzZWxmLgoKCgoKCgo8ZGl2IGNsYXNzPSJmaWd1cmUiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPgo8aW1nIHNyYz0iaW1nL19nd2FzX2R1bW15L3Nob3ctaHdlLnBuZyIgYWx0PSJIYXJkeS1XZWluYmVyZyBFcXVpbGlicml1bSBwLXZhbHVlcyBwZXIgc3RyYXR1bS4iIHdpZHRoPSI4NSUiIC8+CjxwIGNsYXNzPSJjYXB0aW9uIj4oXCNmaWc6c2hvd2h3ZSlIYXJkeS1XZWluYmVyZyBFcXVpbGlicml1bSBwLXZhbHVlcyBwZXIgc3RyYXR1bS48L3A+CjwvZGl2PgoKIyMgRmluYWwgU05QIFFDCgpXZSBhcmUgcmVhZHkgdG8gcGVyZm9ybSB0aGUgZmluYWwgUUMuIEFmdGVyIGluc3BlY3RpbmcgdGhlIGdyYXBocyB3ZSB3aWxsIGZpbHRlciBvbiBhIE1BRiA8IDAuMDEsIGNhbGwgcmF0ZSA8IDAuMDUsIGFuZCBIV0UgPCAwLjAwMDAxIChGaWd1cmUgXEByZWYoZmlnOnNob3dod2UpKSwgaW4gYWRkaXRpb24gdGhvc2UgU05QcyB0aGF0IGZhaWxlZCB0aGUgZGlmZmVyZW50aWFsIGNhbGwgcmF0ZSB0ZXN0IHdpbGwgYmUgcmVtb3ZlZC4KCmBgYApwbGluayAtLWJmaWxlIGR1bW15X3Byb2plY3QvY2xlYW5faW5kc19kYXRhIC0tZXhjbHVkZSBkdW1teV9wcm9qZWN0L2ZhaWwtZGlmZm1pc3MtcWMudHh0IC0tbWFmIDAuMDEgLS1nZW5vIDAuMDUgLS1od2UgMC4wMDAwMSAtLW1ha2UtYmVkIC0tb3V0IGR1bW15X3Byb2plY3QvY2xlYW5kYXRhCmBgYAoKIyMgQSBNaWxlc3RvbmUKCkNvbmdyYXR1bGF0aW9ucy4gWW91IHJlYWNoZWQgYSB2ZXJ5IGltcG9ydGFudCBtaWxlc3RvbmUuIE5vdyB0aGF0IHlvdSBmaWx0ZXJlZCBzYW1wbGVzIGFuZCBTTlBzLCB3ZSBjYW4gZmluYWxseSBzdGFydCB0aGUgYXNzb2NpYXRpb24gYW5hbHlzZXMgaW4gQ2hhcHRlciBcQHJlZihnd2FzX3Rlc3RpbmcpLgoKPCEtLSBgYGB7anMsIGVjaG8gPSBGQUxTRX0gLS0+CjwhLS0gdGl0bGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWRlcicpOyAtLT4KPCEtLSB0aXRsZS5pbm5lckhUTUwgPSAnPGltZyBzcmM9ImltZy9faGVhZGVycy9nd2FzX3NucF9xYy5wbmciIGFsdD0iR1dBUyBiYXNpY3M6IFNOUCBRQyI+JyArIHRpdGxlLmlubmVySFRNTCAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tY2hhcHRlcjplbmQ6MDNfM19nd2FzX2Jhc2ljc19zbnBfcWMuUm1kLS0+CgojIEdlbm9tZS1XaWRlIEFzc29jaWF0aW9uIFN0dWR5IHsjZ3dhc190ZXN0aW5nfQo8IS0tICFbXSguL2ltZy9fZ3dhcy9pbnRlcmFjdGl2ZV9wbG90LnBuZyl7d2lkdGg9NzAlfSAtLT4KCgoKCgoKTm93IHRoYXQgeW91IGhhdmUgbGVhcm5lZCBob3cgdG8gcGVyZm9ybSBRQywgeW91IGNhbiBlYXNpbHkgcnVuIGEgR1dBUyBhbmQgZXhlY3V0ZSBzb21lIGRvd25zdHJlYW0gdmlzdWFsaXphdGlvbiBhbmQgYW5hbHlzZXMuIExldCdzIGRvIHRoaXMgd2l0aCBhIGR1bW15IGRhdGFzZXQuCgojIyBFeHBsb3JpbmcgdGhlIGRhdGEKCkV2ZW4gdGhvdWdoIHNvbWVvbmUgc2F5cyB0aGF0IHRoZSBRQyB3YXMgZG9uZSwgaXQgaXMgc3RpbGwgd2lzZSBhbmQgZ29vZCBwcmFjdGljZSB0byBydW4gc29tZSBvZiB0aGUgY29tbWFuZHMgYWJvdmUgdG8gZ2V0IGEgJ2ZlZWxpbmcnIGFib3V0IHRoZSBkYXRhLiBTbyBsZXQncyBkbyB0aGlzLgoKYGBgCnBsaW5rIC0tYmZpbGUgZ3dhcy9nd2EgLS1mcmVxIC0tb3V0IGR1bW15X3Byb2plY3QvZ3dhCmBgYAoKYGBgCnBsaW5rIC0tYmZpbGUgZ3dhcy9nd2EgLS1taXNzaW5nIC0tb3V0IGR1bW15X3Byb2plY3QvZ3dhCmBgYAoKYGBgCnBsaW5rIC0tYmZpbGUgZ3dhcy9nd2EgLS1oYXJkeSAtLW91dCBkdW1teV9wcm9qZWN0L2d3YQpgYGAKCkxldCdzIHZpc3VhbGl6ZSB0aGUgcmVzdWx0cy4gRmlyc3Qgd2Ugc2hvdWxkIGxvYWQgaW4gYWxsIHRoZSByZXN1bHRzLgoKPiBRdWVzdGlvbjogTG9hZCB0aGUgZGF0YSB1c2luZyBSLiBbSGludDogdXNlIGFuZCBhZGFwdCB0aGUgZXhhbXBsZXMgZnJvbSB0aGUgcHJldmlvdXMgY2hhcHRlcnMuXQoKCgpXZSBjYW4gcGxvdCB0aGUgcGVyLXN0cmF0dW0gSFdFIHAtdmFsdWVzLgoKPiBRdWVzdGlvbjogUGxvdCB0aGUgcGVyLXN0cmF0dW0gSFdFIHAtdmFsdWVzIHVzaW5nIFIuIFtIaW50OiB1c2UgYW5kIGFkYXB0IHRoZSBleGFtcGxlcyBmcm9tIHRoZSBwcmV2aW91cyBjaGFwdGVycy5dCgoKCjxkaXYgY2xhc3M9ImZpZ3VyZSIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+CjxpbWcgc3JjPSJpbWcvX2d3YXNfZHVtbXkvc2hvdy1od2UtZ3dhcy5wbmciIGFsdD0iUGVyIHN0cmF0dW0gSFdFIHAtdmFsdWVzLiIgd2lkdGg9Ijg1JSIgLz4KPHAgY2xhc3M9ImNhcHRpb24iPihcI2ZpZzp1bm5hbWVkLWNodW5rLTIpUGVyIHN0cmF0dW0gSFdFIHAtdmFsdWVzLjwvcD4KPC9kaXY+CgpXZSB3aWxsIHdhbnQgdG8gc2VlIHdoYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiBhbGxlbGUgZnJlcXVlbmNpZXMgbG9va3MgbGlrZS4gCgo+IFF1ZXN0aW9uOiBQbG90IHRoZSBhbGxlbGUgZnJlcXVlbmNpZXMgdXNpbmcgUi4gW0hpbnQ6IHVzZSBhbmQgYWRhcHQgdGhlIGV4YW1wbGVzIGZyb20gdGhlIHByZXZpb3VzIGNoYXB0ZXJzLl0KCgoKPGRpdiBjbGFzcz0iZmlndXJlIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj4KPGltZyBzcmM9ImltZy9fZ3dhc19kdW1teS9zaG93LWZyZXEtZ3dhcy5wbmciIGFsdD0iTWlub3IgYWxsZWxlIGZyZXF1ZW5jaWVzLiIgd2lkdGg9Ijg1JSIgLz4KPHAgY2xhc3M9ImNhcHRpb24iPihcI2ZpZzp1bm5hbWVkLWNodW5rLTMpTWlub3IgYWxsZWxlIGZyZXF1ZW5jaWVzLjwvcD4KPC9kaXY+CgpXZSB3aWxsIHdhbnQgdG8gaWRlbnRpZnkgc2FtcGxlcyB0aGF0IGhhdmUgcG9vciBjYWxsIHJhdGVzLgoKPiBRdWVzdGlvbjogUGxvdCB0aGUgcGVyLXNhbXBsZSBjYWxsIHJhdGVzIHVzaW5nIFIuIFtIaW50OiB1c2UgYW5kIGFkYXB0IHRoZSBleGFtcGxlcyBmcm9tIHRoZSBwcmV2aW91cyBjaGFwdGVycy5dCgoKCjxkaXYgY2xhc3M9ImZpZ3VyZSIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+CjxpbWcgc3JjPSJpbWcvX2d3YXNfZHVtbXkvc2hvdy1zYW1wbGUtY2FsbHJhdGUtZ3dhcy5wbmciIGFsdD0iUGVyIHNhbXBsZSBjYWxsIHJhdGVzLiIgd2lkdGg9Ijg1JSIgLz4KPHAgY2xhc3M9ImNhcHRpb24iPihcI2ZpZzp1bm5hbWVkLWNodW5rLTQpUGVyIHNhbXBsZSBjYWxsIHJhdGVzLjwvcD4KPC9kaXY+CgpXZSBhbHNvIG5lZWQgdG8ga25vdyB3aGF0IHRoZSBwZXIgU05QIGNhbGwgcmF0ZXMgYXJlLgoKPiBRdWVzdGlvbjogUGxvdCB0aGUgcGVyLVNOUCBjYWxsIHJhdGVzIHVzaW5nIFIuIFtIaW50OiB1c2UgYW5kIGFkYXB0IHRoZSBleGFtcGxlcyBmcm9tIHRoZSBwcmV2aW91cyBjaGFwdGVycy5dCgoKCjxkaXYgY2xhc3M9ImZpZ3VyZSIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+CjxpbWcgc3JjPSJpbWcvX2d3YXNfZHVtbXkvc2hvdy1zbnAtY2FsbHJhdGUtZ3dhcy5wbmciIGFsdD0iUGVyIFNOUCBjYWxsIHJhdGVzLiIgd2lkdGg9Ijg1JSIgLz4KPHAgY2xhc3M9ImNhcHRpb24iPihcI2ZpZzp1bm5hbWVkLWNodW5rLTUpUGVyIFNOUCBjYWxsIHJhdGVzLjwvcD4KPC9kaXY+CgoKIyMgR2VuZXRpYyBtb2RlbHMKQSBzaW1wbGUgY2hpLXNxdWFyZSB0ZXN0IG9mIGFzc29jaWF0aW9uIGNhbiBiZSBkb25lLgoKYGBgCnBsaW5rIC0tYmZpbGUgZ3dhcy9nd2EgLS1tb2RlbCAtLW91dCBnd2FzL2RhdGEKYGBgCgpfR2Vub3R5cGljXywgX2RvbWluYW50XyBhbmQgX3JlY2Vzc2l2ZV8gdGVzdHMgd2lsbCBub3QgYmUgY29uZHVjdGVkIGlmIGFueSBvbmUgb2YgdGhlIGNlbGxzIGluIHRoZSB0YWJsZSBvZiBjYXNlLWNvbnRyb2wgYnkgZ2Vub3R5cGUgY291bnRzIGNvbnRhaW5zIGxlc3MgdGhhbiBmaXZlIG9ic2VydmF0aW9ucy4gVGhpcyBpcyBiZWNhdXNlIHRoZSBjaGktc3F1YXJlIGFwcHJveGltYXRpb24gbWF5IG5vdCBiZSByZWxpYWJsZSB3aGVuIGNlbGwgY291bnRzIGFyZSBzbWFsbC4gRm9yIFNOUHMgd2l0aCBNQUZzIDwgNSUsIGEgc2FtcGxlIG9mIG1vcmUgdGhhbiAyLDAwMCBjYXNlcyBhbmQgY29udHJvbHMgd291bGQgYmUgcmVxdWlyZWQgdG8gbWVldCB0aGlzIHRocmVzaG9sZCBhbmQgbW9yZSB0aGFuIDUwLDAwMCB3b3VsZCBiZSByZXF1aXJlZCBmb3IgU05QcyB3aXRoIE1BRiA8IDElLgoKWW91IGNhbiBjaGFuZ2UgdGhpcyBkZWZhdWx0IGJlaGF2aW91ciBieSBhZGRpbmcgdGhlIGZsYWcgYC0tY2VsbGAsIF9lLmcuXywgd2UgY291bGQgbG93ZXIgdGhlIHRocmVzaG9sZCB0byAzLgoKYGBgCnBsaW5rIC0tYmZpbGUgZ3dhcy9nd2EgLS1tb2RlbCAtLWNlbGwgMyAtLW91dCBnd2FzL2RhdGEKYGBgCgpMZXQncyByZXZpZXcgdGhlIGNvbnRlbnRzIG9mIHRoZSByZXN1bHRzLgoKCgpJdCBjb250YWlucyAxLDUzMCw1MTAgcm93cywgb25lIGZvciBlYWNoIFNOUCwgYW5kIGVhY2ggdHlwZSBvZiB0ZXN0IChfZ2Vub3R5cGljXywgX3RyZW5kXywgX2FsbGVsaWNfLCBfZG9taW5hbnRfLCBhbmQgX3JlY2Vzc2l2ZV8pIGFuZCB0aGUgZm9sbG93aW5nIGNvbHVtbnM6CgotIGNocm9tb3NvbWUgW2BDSFJgXSwKLSB0aGUgU05QIGlkZW50aWZpZXIgW2BTTlBgXSwKLSB0aGUgbWlub3IgYWxsZWxlIFtgQTFgXSAocmVtZW1iZXIsIGBQTElOS2AgYWx3YXlzIGNvZGVzIHRoZSBBMS1hbGxlbGUgYXMgdGhlIG1pbm9yIGFsbGVsZSEpLAotIHRoZSBtYWpvciBhbGxlbGUgW2BBMmBdLAotIHRoZSB0ZXN0IHBlcmZvcm1lZCBbYFRFU1RgXToKICAtIGBHRU5PYCAoZ2Vub3R5cGljIGFzc29jaWF0aW9uKTsKICAtIGBUUkVORGAgKENvY2hyYW4tQXJtaXRhZ2UgdHJlbmQpOwogIC0gYEFMTEVMSUNgIChhbGxlbGljIGFzLSBzb2NpYXRpb24pOwogIC0gYERPTWAgKGRvbWluYW50IG1vZGVsKTsgYW5kCiAgLSBgUkVDYCAocmVjZXNzaXZlIG1vZGVsKV0sCi0gdGhlIGNlbGwgZnJlcXVlbmN5IGNvdW50cyBmb3IgY2FzZXMgW2BBRkZgXSwgCi0gdGhlIGNlbGwgZnJlcXVlbmN5IGNvdW50cyBmb3IgY29udHJvbHMgW2BVTkFGRmBdLAotIHRoZSBjaGktc3F1YXJlIHRlc3Qgc3RhdGlzdGljIFtgQ0hJU1FgXSwKLSB0aGUgZGVncmVlcyBvZiBmcmVlZG9tIGZvciB0aGUgdGVzdCBbYERGYF0sCi0gYW5kIHRoZSBhc3ltcHRvdGljIFAgdmFsdWUgW2BQYF0gb2YgYXNzb2NpYXRpb24uCgo+IFF1ZXN0aW9uOiBEbyB5b3Uga25vdyB3aGljaCBtb2RlbCwgX2kuZS5fIGBURVNUYCBpcyBtb3N0IGNvbW1vbmx5IHVzZWQgYW5kIHJlcG9ydGVkPyBBbmQgd2h5IGlzIHRoYXQsIGRvIHRoaW5rPwoKIyMgTG9naXN0aWMgcmVncmVzc2lvbgpXZSBjYW4gYWxzbyBwZXJmb3JtIGEgdGVzdCBvZiBhc3NvY2lhdGlvbiB1c2luZyBsb2dpc3RpYyByZWdyZXNzaW9uLiBJbiB0aGlzIGNhc2Ugd2UgbWlnaHQgd2FudCB0byBjb3JyZWN0IGZvciBjb3ZhcmlhdGVzL2NvbmZvdW5kaW5nIGZhY3RvcnMsIGZvciBleGFtcGxlIGFnZSwgc2V4LCBhbmNlc3RyYWwgYmFja2dyb3VuZCwgaS5lLiBwcmluY2lwYWwgY29tcG9uZW50cywgYW5kIG90aGVyIHN0dWR5IHNwZWNpZmljIGNvdmFyaWF0ZXMgKGUuZy4gaG9zcGl0YWwgb2YgaW5jbHVzaW9uLCBnZW5vdHlwaW5nIGNlbnRyZSBldGMuKS4gSW4gdGhhdCBjYXNlIGVhY2ggb2YgdGhlc2UgUCB2YWx1ZXMgaXMgYWRqdXN0ZWQgZm9yIHRoZSBlZmZlY3Qgb2YgdGhlIGNvdmFyaWF0ZXMuCgpXaGVuIHJ1bm5pbmcgYSByZWdyZXNzaW9uIGFuYWx5c2lzLCBiZSBpdCBsaW5lYXIgb3IgbG9naXN0aWMsIFBMSU5LIGFzc3VtZXMgYSBtdWx0aXBsaWNhdGl2ZSBtb2RlbC4gQnkgZGVmYXVsdCwgd2hlbiBhdCBsZWFzdCBvbmUgbWFsZSBhbmQgb25lIGZlbWFsZSBpcyBwcmVzZW50LCBzZXggKG1hbGUgPSAxLCBmZW1hbGUgPSAwKSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzIGEgY292YXJpYXRlIG9uIFggY2hyb21vc29tZSBTTlBzLCBhbmQgbm93aGVyZSBlbHNlLiBUaGUgYHNleGAgZmxhZyBjYXVzZXMgaXQgdG8gYmUgYWRkZWQgZXZlcnl3aGVyZSwgd2hpbGUgYG5vLXgtc2V4YCBleGNsdWRlcyBpdC4KCmBgYApwbGluayAtLWJmaWxlIGd3YXMvZ3dhIC0tbG9naXN0aWMgc2V4IC0tY292YXIgZ3dhcy9nd2EuY292YXIgLS1vdXQgZ3dhcy9kYXRhCmBgYAoKTGV0J3MgZXhhbWluZSB0aGUgcmVzdWx0cy4KCgoKYGBgCiMjIFsxXSA5MTgzMDYgICAgICA5CmBgYAoKCmBgYAojIyAgICAgIENIUiAgICAgICBTTlAgICAgICBCUCAgICAgQTEgICBURVNUIE5NSVNTICAgICBPUiAgICAgU1RBVCAgICAgIFAKIyMgICAgPGludD4gICAgPGNoYXI+ICAgPGludD4gPGNoYXI+IDxjaGFyPiA8aW50PiAgPG51bT4gICAgPG51bT4gIDxudW0+CiMjIDE6ICAgICAxIHJzMzkzNDgzNCAgOTk1NjY5ICAgICAgVCAgICBBREQgIDM4MTggMS4wMjkwICAwLjM4MTIwIDAuNzAzMQojIyAyOiAgICAgMSByczM5MzQ4MzQgIDk5NTY2OSAgICAgIFQgICAgQUdFICAzODE4IDEuMDAyMCAgMS4xMTgwMCAwLjI2MzUKIyMgMzogICAgIDEgcnMzOTM0ODM0ICA5OTU2NjkgICAgICBUICAgIFNFWCAgMzgxOCAxLjAxMjAgIDAuMTkwOTAgMC44NDg2CiMjIDQ6ICAgICAxIHJzMzczNzcyOCAxMDExMjc4ICAgICAgQSAgICBBREQgIDM5ODIgMS4wMTkwICAwLjM4NjcwIDAuNjk5MAojIyA1OiAgICAgMSByczM3Mzc3MjggMTAxMTI3OCAgICAgIEEgICAgQUdFICAzOTgyIDEuMDAyMCAgMS4wOTgwMCAwLjI3MjEKIyMgNjogICAgIDEgcnMzNzM3NzI4IDEwMTEyNzggICAgICBBICAgIFNFWCAgMzk4MiAxLjAwNjAgIDAuMDk4OTggMC45MjEyCiMjIDc6ICAgICAxIHJzNjY4Nzc3NiAxMDIwNDI4ICAgICAgVCAgICBBREQgIDM5MTUgMC45NjkyIC0wLjMzMzMwIDAuNzM4OQojIyA4OiAgICAgMSByczY2ODc3NzYgMTAyMDQyOCAgICAgIFQgICAgQUdFICAzOTE1IDEuMDAyMCAgMS4wNDAwMCAwLjI5ODQKIyMgOTogICAgIDEgcnM2Njg3Nzc2IDEwMjA0MjggICAgICBUICAgIFNFWCAgMzkxNSAxLjAxNTAgIDAuMjM2OTAgMC44MTI3CmBgYAoKPiBRdWVzdGlvbjogSG93IGNvbWUgdGhlcmUgYXJlIG1vcmUgbGluZXMgaW4gdGhpcyBmaWxlIHRoYW4gdGhlcmUgYXJlIHZhcmlhbnRzPwoKSWYgbm8gbW9kZWwgb3B0aW9uIGlzIHNwZWNpZmllZCwgdGhlIGZpcnN0IHJvdyBmb3IgZWFjaCBTTlAgY29ycmVzcG9uZHMgdG8gcmVzdWx0cyBmb3IgYSBtdWx0aXBsaWNhdGl2ZSB0ZXN0IG9mIGFzc29jaWF0aW9uLiBUaGUgQyA+PSAwIHN1YnNlcXVlbnQgcm93cyBmb3IgZWFjaCBTTlAgY29ycmVzcG9uZCB0byBzZXBhcmF0ZSB0ZXN0cyBvZiBzaWduaWZpY2FuY2UgZm9yIGVhY2ggb2YgdGhlIEMgY292YXJpYXRlcyBpbmNsdWRlZCBpbiB0aGUgcmVncmVzc2lvbiBtb2RlbC4gV2UgY2FuIHJlbW92ZSB0aGUgY292YXJpYXRlLXNwZWNpZmljIGxpbmVzIGZyb20gdGhlIG1haW4gcmVwb3J0IGJ5IGFkZGluZyB0aGUgYGhpZGUtY292YXJgIGZsYWcuCgpUaGUgY29sdW1ucyBpbiB0aGUgYXNzb2NpYXRpb24gcmVzdWx0cyBhcmU6CgotIHRoZSBjaHJvbW9zb21lIFtgQ0hSYF0sCi0gdGhlIFNOUCBpZGVudGlmaWVyIFtgU05QYF0sCi0gdGhlIGJhc2UtcGFpciBsb2NhdGlvbiBbYEJQYF0sCi0gdGhlIG1pbm9yIGFsbGVsZSBbYEExYF0sCi0gdGhlIHRlc3QgcGVyZm9ybWVkIFtgVEVTVGBdOiBBREQgKG11bHRpcGxpY2F0aXZlIG1vZGVsIG9yIGdlbm90eXBpYyBtb2RlbCB0ZXN0aW5nIGFkZGl0aXZpdHkpLAogIC0gYEdFTk9fMkRGYCAoZ2Vub3R5cGljIG1vZGVsKSwKICAtIGBET01ERVZgIChnZW5vdHlwaWMgbW9kZWwgdGVzdGluZyBkZXZpYXRpb24gZnJvbSBhZGRpdGl2aXR5KSwKICAtIGBET01gIChkb21pbmFudCBtb2RlbCksIG9yCiAgLSBgUkVDYCAocmVjZXNzaXZlIG1vZGVsKV0sCi0gdGhlIG51bWJlciBvZiBtaXNzaW5nIGluZGl2aWR1YWxzIGluY2x1ZGVkIFtgTk1JU1NgXSwKLSB0aGUgYE9SYCByZWxhdGl2ZSB0byB0aGUgQTEsIF9pLmUuXyBtaW5vciBhbGxlbGUsCi0gdGhlIGNvZWZmaWNpZW50IHotc3RhdGlzdGljIFtgU1RBVGBdLCBhbmQKLSB0aGUgYXN5bXB0b3RpYyBQLXZhbHVlIFtgUGBdIG9mIGFzc29jaWF0aW9uLgoKV2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIHN0YW5kYXJkIGVycm9yIGFuZCBjb25maWRlbmNlIGludGVydmFsIGZyb20gdGhlIHotc3RhdGlzdGljLiBXZSBjYW4gbW9kaWZ5IHRoZSBlZmZlY3Qgc2l6ZSAoYE9SYCkgdG8gb3V0cHV0IHRoZSBfYmV0YV8gYnkgYWRkaW5nIHRoZSBgYmV0YWAgZmxhZy4KCj4gUXVlc3Rpb246IENhbiB5b3Ugd3JpdGUgZG93biB0aGUgbWF0aGVtYXRpY2FsIHJlbGF0aW9uIGJldHdlZW4gX2JldGFfIGFuZCBfT1JfPwoKIyMgTGV0J3MgZ2V0IHZpc3VhbAoKTG9va2luZyBhdCBudW1iZXJzIGlzIGltcG9ydGFudCwgYnV0IGl0IHdvbid0IGdpdmUgeW91IGEgcGVyZmVjdCBvdmVydmlldy4gV2Ugc2hvdWxkIHR1cm4gdG8gdmlzdWFsaXppbmcgb3VyIHJlc3VsdHMgaW4gQ2hhcHRlciBcQHJlZihnd2FzLXZpc3VhbHMpLgoKPCEtLSBgYGB7anMsIGVjaG8gPSBGQUxTRX0gLS0+CjwhLS0gdGl0bGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWRlcicpOyAtLT4KPCEtLSB0aXRsZS5pbm5lckhUTUwgPSAnPGltZyBzcmM9ImltZy9faGVhZGVycy9pbnRlcmFjdGl2ZV9wbG90LnBuZyIgYWx0PSJHV0FTIGJhc2ljczogYXNzb2NpYXRpb24gdGVzdGluZyI+JyArIHRpdGxlLmlubmVySFRNTCAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tY2hhcHRlcjplbmQ6MDNfNF9nd2FzX2Jhc2ljc19hc3NvY2lhdGlvbl90ZXN0aW5nLlJtZC0tPgoKIyBHV0FTIHZpc3VhbGlzYXRpb24geyNnd2FzLXZpc3VhbHN9CjwhLS0gIVtdKC4vaW1nL19oZWFkZXJzL2ludGVyYWN0aXZlX3Bsb3QucG5nKXt3aWR0aD0xMDAlfSAtLT4KCgoKCgpEYXRhIHZpc3VhbGl6YXRpb24gaXMga2V5LCBub3Qgb25seSBmb3IgcHJlc2VudGF0aW9uIGJ1dCBhbHNvIHRvIGluc3BlY3QgdGhlIHJlc3VsdHMuCgojIyMgUVEgcGxvdHMKV2Ugc2hvdWxkIGNyZWF0ZSBfcXVhbnRpbGUtcXVhbnRpbGUgKFFRKSBwbG90c18gdG8gY29tcGFyZSB0aGUgb2JzZXJ2ZWQgYXNzb2NpYXRpb24gdGVzdCBzdGF0aXN0aWNzIHdpdGggdGhlaXIgZXhwZWN0ZWQgdmFsdWVzIHVuZGVyIHRoZSBudWxsIGh5cG90aGVzaXMgb2Ygbm8gYXNzb2NpYXRpb24gYW5kIHNvIGFzc2VzcyB0aGUgbnVtYmVyLCBtYWduaXR1ZGUgYW5kIHF1YWxpdHkgb2YgdHJ1ZSBhc3NvY2lhdGlvbnMuCgpGaXJzdCwgd2Ugd2lsbCBhZGQgdGhlIHN0YW5kYXJkIGVycm9yLCBjYWxsIHJhdGUsIEEyLCBhbmQgYWxsZWxlIGZyZXF1ZW5jaWVzLgoKCmBgYAojIyBLZXk6IDxTTlA+CiMjICAgICAgICAgICBTTlAgICBDSFIgICAgICAgIEJQICAgICBBMSBOTUlTUyAgICAgT1IgICAgU1RBVCAgICAgICBQICAgICBBMiAgICBNQUYKIyMgICAgICAgIDxjaGFyPiA8aW50PiAgICAgPGludD4gPGNoYXI+IDxpbnQ+ICA8bnVtPiAgIDxudW0+ICAgPG51bT4gPGNoYXI+ICA8bnVtPgojIyAxOiByczEwMDAwMDEwICAgICA0ICAyMTIyNzc3MiAgICAgIEMgIDM5OTYgMS4wNDIwICAwLjkwMTAgMC4zNjc2MCAgICAgIFQgMC40MjU4CiMjIDI6IHJzMTAwMDAwMjMgICAgIDQgIDk1OTUyOTI5ICAgICAgVCAgMzk1NyAwLjk5MDIgLTAuMjE2MCAwLjgyOTAwICAgICAgRyAwLjQ4NDEKIyMgMzogcnMxMDAwMDAzMCAgICAgNCAxMDM1OTMxNzkgICAgICBBICAzOTkxIDAuOTc3OSAtMC4zNjk2IDAuNzExNzAgICAgICBHIDAuMTYxNgojIyA0OiAgcnMxMDAwMDA3ICAgICAyIDIzNzQxNjc5MyAgICAgIEMgIDQwMDAgMS4wMTgwICAwLjM2NDkgMC43MTUyMCAgICAgIFQgMC4zMTIyCiMjIDU6IHJzMTAwMDAwOTIgICAgIDQgIDIxNTA0NjE1ICAgICAgQyAgMzk2MyAwLjkyNDAgLTEuNjc3MCAwLjA5MzU0ICAgICAgVCAwLjM0MzAKIyMgNjogcnMxMDAwMDEyMSAgICAgNCAxNTc3OTM0ODUgICAgICBHICAzOTE5IDAuOTY2NSAtMC43NTI1IDAuNDUxNzAgICAgICBBIDAuNDUzMgojIyAgICBOQ0hST0JTIGNhbGxyYXRlCiMjICAgICAgPGludD4gICAgPG51bT4KIyMgMTogICAgNzk5MiAgMC45OTkwMAojIyAyOiAgICA3OTE0ICAwLjk4OTI1CiMjIDM6ICAgIDc5ODIgIDAuOTk3NzUKIyMgNDogICAgODAwMCAgMS4wMDAwMAojIyA1OiAgICA3OTI2ICAwLjk5MDc1CiMjIDY6ICAgIDc4MzggIDAuOTc5NzUKYGBgCgpgYGAKIyMgWzFdIDMwNjEwMiAgICAgMTQKYGBgCgpgYGAKIyMgIyBBIHRpYmJsZTogNiDDlyAxNAojIyAgIFNOUCAgICAgICAgQ0hSICAgICBCUCBBMSAgICBBMiAgICAgIE1BRiBjYWxscmF0ZSBOTUlTUyBOQ0hST0JTICAgICBCRVRBICAgICBTRQojIyAgIDxjaHI+ICAgIDxpbnQ+ICA8aW50PiA8Y2hyPiA8Y2hyPiA8ZGJsPiAgICA8ZGJsPiA8aW50PiAgIDxpbnQ+ICAgIDxkYmw+ICA8ZGJsPgojIyAxIHJzMTAwMDDigKYgICAgIDQgMi4xMmU3IEMgICAgIFQgICAgIDAuNDI2ICAgIDAuOTk5ICAzOTk2ICAgIDc5OTIgIDAuMDQxMSAgMC4wNDU3CiMjIDIgcnMxMDAwMOKApiAgICAgNCA5LjYwZTcgVCAgICAgRyAgICAgMC40ODQgICAgMC45ODkgIDM5NTcgICAgNzkxNCAtMC4wMDk4NSAwLjA0NTYKIyMgMyByczEwMDAw4oCmICAgICA0IDEuMDRlOCBBICAgICBHICAgICAwLjE2MiAgICAwLjk5OCAgMzk5MSAgICA3OTgyIC0wLjAyMjMgIDAuMDYwNQojIyA0IHJzMTAwMDDigKYgICAgIDIgMi4zN2U4IEMgICAgIFQgICAgIDAuMzEyICAgIDEgICAgICA0MDAwICAgIDgwMDAgIDAuMDE3OCAgMC4wNDg5CiMjIDUgcnMxMDAwMOKApiAgICAgNCAyLjE1ZTcgQyAgICAgVCAgICAgMC4zNDMgICAgMC45OTEgIDM5NjMgICAgNzkyNiAtMC4wNzkwICAwLjA0NzEKIyMgNiByczEwMDAw4oCmICAgICA0IDEuNThlOCBHICAgICBBICAgICAwLjQ1MyAgICAwLjk4MCAgMzkxOSAgICA3ODM4IC0wLjAzNDEgIDAuMDQ1MwojIyAjIOKEuSAzIG1vcmUgdmFyaWFibGVzOiBPUiA8ZGJsPiwgU1RBVCA8ZGJsPiwgUCA8ZGJsPgpgYGAKCkxldCdzIGxpc3QgdGhlIG51bWJlciBvZiBTTlBzIHBlciBjaHJvbW9zb21lLiBUaGlzIGdpdmVzIGEgcHJldHR5IGdvb2QgaWRlYSBhYm91dCB0aGUgcGVyLWNocm9tb3NvbWUgY292ZXJhZ2UuIEFuZCBpdCdzIGEgc2FuaXR5IGNoZWNrOiBkaWQgdGhlIHdob2xlIGFuYWx5c2lzIHJ1biBwcm9wZXJseSAod2UgZXhwZWN0IDIyIGNocm9tb3NvbWVzKT8KCgoKCgo+IFF1ZXN0aW9uOiBXaHkgZG8gdGhlIG51bWJlciBvZiB2YXJpYW50cyBwZXIgY2hyb3NvbWUgKGFwcHJveGltYXRlbHkpIGNvcnJlbGF0ZSB3aXRoIHRoZSBjaHJvbW9zb21lIG51bWJlcj8KCj4gUXVlc3Rpb246IFdoZXJlIGFyZSB0aGUgZGF0YSBmb3IgY2hyb21vc29tZSBYLCBZIGFuZCBNVD8KCkxldCdzIHBsb3QgdGhlIFFRIHBsb3QgdG8gZGlhZ25vc2Ugb3VyIEdXQVMuIAoKCjxkaXYgY2xhc3M9ImZpZ3VyZSIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+CjxpbWcgc3JjPSJpbWcvX2d3YXNfZHVtbXkvc2hvdy1xcS5wbmciIGFsdD0iQSBRUSBwbG90LiIgd2lkdGg9Ijg1JSIgLz4KPHAgY2xhc3M9ImNhcHRpb24iPihcI2ZpZzpzaG93LXFxKUEgUVEgcGxvdC48L3A+CjwvZGl2PgoKIyMgTWFuaGF0dGFuIHBsb3RzCgpXZSBhbHNvIG5lZWQgdG8gY3JlYXRlIGEgX01hbmhhdHRhbiBwbG90XyB0byBkaXNwbGF5IHRoZSBhc3NvY2lhdGlvbiB0ZXN0IFAtdmFsdWVzIGFzIGEgZnVuY3Rpb24gb2YgY2hyb21vc29tYWwgbG9jYXRpb24gYW5kIHRodXMgcHJvdmlkZSBhIHZpc3VhbCBzdW1tYXJ5IG9mIGFzc29jaWF0aW9uIHRlc3QgcmVzdWx0cyB0aGF0IGRyYXcgaW1tZWRpYXRlIGF0dGVudGlvbiB0byBhbnkgcmVnaW9ucyBvZiBzaWduaWZpY2FuY2UgKEZpZ3VyZSBcQHJlZihmaWc6c2hvd21hbmhhdHRhbikpLgoKCgo8ZGl2IGNsYXNzPSJmaWd1cmUiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPgo8aW1nIHNyYz0iaW1nL19nd2FzX2R1bW15L3Nob3ctbWFuaGF0dGFuLnBuZyIgYWx0PSJBIG1hbmhhdHRhbiBwbG90LiIgd2lkdGg9Ijg1JSIgLz4KPHAgY2xhc3M9ImNhcHRpb24iPihcI2ZpZzpzaG93bWFuaGF0dGFuKUEgbWFuaGF0dGFuIHBsb3QuPC9wPgo8L2Rpdj4KCiMjIE90aGVyIHBsb3RzCgpJdCBpcyBhbHNvIGluZm9ybWF0aXZlIHRvIHBsb3QgdGhlIGRlbnNpdHkgcGVyIGNocm9tb3NvbWUuIFdlIGNhbiB1c2UgdGhlIGBDTXBsb3RgIGZvciB0aGF0IHdoaWNoIHlvdSBjYW4gZmluZCBbaGVyZV0oaHR0cHM6Ly9naXRodWIuY29tL1lpbkxpTGluL1ItQ01wbG90KXt0YXJnZXQ9Il9ibGFuayJ9LiBGb3Igbm93IHdlIGp1c3QgbWFrZSB0aGVzZSBncmFwaHMgJ3F1aWNrLW4tZGlydHknLCB5b3UgY2FuIGZ1cnRoZXIgcHJldHRpZnkgdGhlbSwgYnV0IHlvdSBlYXNpbHkgbG9vc2UgdHJhY2sgb2YgdGltZSwgc28gbWF5YmUgY2Fycnkgb24uCgoKCgoKCj4gUXVlc3Rpb246IFdoYXQgZG8gdGhlIGdyZXkgc3BvdHMgb24gdGhlIGRlbnNpdHkgcGxvdCBpbmRpY2F0ZT8KClRoaXMgd291bGQgbGVhZCB0byB0aGUgZm9sbG93aW5nIGdyYXBocy4gCjxkaXYgY2xhc3M9ImZpZ3VyZSIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+CjxpbWcgc3JjPSJpbWcvX2d3YXNfZHVtbXkvc2hvdy1jbXBsb3QtYWxsLWRlbnNpdHkucG5nIiBhbHQ9IlNOUCBkZW5zaXR5IG9mIHRoZSBhc3NvY2lhdGlvbiByZXN1bHRzLiIgd2lkdGg9Ijg1JSIgLz4KPHAgY2xhc3M9ImNhcHRpb24iPihcI2ZpZzpzaG93Y21wbG90YWxsZGVuc2l0eSlTTlAgZGVuc2l0eSBvZiB0aGUgYXNzb2NpYXRpb24gcmVzdWx0cy48L3A+CjwvZGl2PgoKPGRpdiBjbGFzcz0iZmlndXJlIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj4KPGltZyBzcmM9ImltZy9fZ3dhc19kdW1teS9zaG93LWNtcGxvdC1hbGwtcXEucG5nIiBhbHQ9IkEgUVEgcGxvdCBpbmNsdWRpbmcgYSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAoYmx1ZSBhcmVhKSBhbmQgZ2Vub21lLXdpZGUgc2lnbmlmaWNhbnQgaGl0cyAocmVkKS4iIHdpZHRoPSI4NSUiIC8+CjxwIGNsYXNzPSJjYXB0aW9uIj4oXCNmaWc6c2hvd2NtcGxvdGFsbHFxKUEgUVEgcGxvdCBpbmNsdWRpbmcgYSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAoYmx1ZSBhcmVhKSBhbmQgZ2Vub21lLXdpZGUgc2lnbmlmaWNhbnQgaGl0cyAocmVkKS48L3A+CjwvZGl2PgoKPGRpdiBjbGFzcz0iZmlndXJlIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj4KPGltZyBzcmM9ImltZy9fZ3dhc19kdW1teS9zaG93LWNtcGxvdC1hbGwtbWFuaGF0dGFuLnBuZyIgYWx0PSJBIHJlZ3VsYXIgbWFuaGF0dGFuIHBsb3QuIENvbG9yZWQgYnkgY2hyb21vc29tZSwgc3VnZ2VzdGl2ZSBoaXRzIGFyZSBncmVlbiwgZ2Vub21lLXdpZGUgaGl0cyBhcmUgcmVkLiBUaGUgYm90dG9tIGdyYXBoIHNob3dzIHRoZSBwZXItY2hyb21vc29tZSBTTlAgZGVuc2l0eS4iIHdpZHRoPSI4NSUiIC8+CjxwIGNsYXNzPSJjYXB0aW9uIj4oXCNmaWc6c2hvd2NtcGxvdGFsbG1hbmhhdHRhbilBIHJlZ3VsYXIgbWFuaGF0dGFuIHBsb3QuIENvbG9yZWQgYnkgY2hyb21vc29tZSwgc3VnZ2VzdGl2ZSBoaXRzIGFyZSBncmVlbiwgZ2Vub21lLXdpZGUgaGl0cyBhcmUgcmVkLiBUaGUgYm90dG9tIGdyYXBoIHNob3dzIHRoZSBwZXItY2hyb21vc29tZSBTTlAgZGVuc2l0eS48L3A+CjwvZGl2PgoKPGRpdiBjbGFzcz0iZmlndXJlIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj4KPGltZyBzcmM9ImltZy9fZ3dhc19kdW1teS9zaG93LWNtcGxvdC1hbGwtY2lyY3VsYXIucG5nIiBhbHQ9IkEgY2lyY3VsYXIgbWFuaGF0dGFuLiIgd2lkdGg9Ijg1JSIgLz4KPHAgY2xhc3M9ImNhcHRpb24iPihcI2ZpZzpzaG93LWNtcGxvdC1hbGwtY2lyY3VsYXIpQSBjaXJjdWxhciBtYW5oYXR0YW4uPC9wPgo8L2Rpdj4KCiMjIEludGVyYWN0aXZlIHBsb3RzCgpZb3UgY2FuIGFsc28gbWFrZSBhbiBbaW50ZXJhY3RpdmUgdmVyc2lvbl0oaHR0cHM6Ly9yLWdyYXBoLWdhbGxlcnkuY29tLzEwMV9NYW5oYXR0YW5fcGxvdC5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9IG9mIHRoZSBNYW5oYXR0YW4gLSBqdXN0IGJlY2F1c2UgeW91IGNhbi4gVGhlIGNvZGUgYmVsb3cgc2hvd3MgeW91IGhvdy4KCgpgYGAKbGlicmFyeShwbG90bHkpCmxpYnJhcnkoZHBseXIpCgojIFByZXBhcmUgdGhlIGRhdGFzZXQgKGFzIGFuIGV4YW1wbGUgd2UgdXNlIHRoZSBkYXRhIChnd2FzUmVzdWx0cykgZnJvbSB0aGUgYHFxbWFuYC1wYWNrYWdlKQpkb24gPC0gZ3dhc1Jlc3VsdHMgJT4lCgogICMgQ29tcHV0ZSBjaHJvbW9zb21lIHNpemUKICBncm91cF9ieShDSFIpICU+JQogIHN1bW1hcmlzZShjaHJfbGVuPW1heChCUCkpICU+JQoKICAjIENhbGN1bGF0ZSBjdW11bGF0aXZlIHBvc2l0aW9uIG9mIGVhY2ggY2hyb21vc29tZQogIG11dGF0ZSh0b3Q9Y3Vtc3VtKGNocl9sZW4pLWNocl9sZW4pICU+JQogIHNlbGVjdCgtY2hyX2xlbikgJT4lCgogICMgQWRkIHRoaXMgaW5mbyB0byB0aGUgaW5pdGlhbCBkYXRhc2V0CiAgbGVmdF9qb2luKGd3YXNSZXN1bHRzLCAuLCBieT1jKCJDSFIiPSJDSFIiKSkgJT4lCgogICMgQWRkIGEgY3VtdWxhdGl2ZSBwb3NpdGlvbiBvZiBlYWNoIFNOUAogIGFycmFuZ2UoQ0hSLCBCUCkgJT4lCiAgbXV0YXRlKCBCUGN1bT1CUCt0b3QpICU+JQoKICAjIEFkZCBoaWdobGlnaHQgYW5kIGFubm90YXRpb24gaW5mb3JtYXRpb24KICBtdXRhdGUoIGlzX2hpZ2hsaWdodD1pZmVsc2UoU05QICVpbiUgc25wc09mSW50ZXJlc3QsICJ5ZXMiLCAibm8iKSkgJT4lCgogICMgRmlsdGVyIFNOUCB0byBtYWtlIHRoZSBwbG90IGxpZ2h0ZXIKICBmaWx0ZXIoLWxvZzEwKFApPjAuNSkKCiMgUHJlcGFyZSBYIGF4aXMKYXhpc2RmIDwtIGRvbiAlPiUgZ3JvdXBfYnkoQ0hSKSAlPiUgc3VtbWFyaXplKGNlbnRlcj0oIG1heChCUGN1bSkgKyBtaW4oQlBjdW0pICkgLyAyICkKCiMgUHJlcGFyZSB0ZXh0IGRlc2NyaXB0aW9uIGZvciBlYWNoIFNOUDoKZG9uJHRleHQgPC0gcGFzdGUoIlNOUDogIiwgZG9uJFNOUCwgIlxuUG9zaXRpb246ICIsIGRvbiRCUCwgIlxuQ2hyb21vc29tZTogIiwgZG9uJENIUiwgIlxuTE9EIHNjb3JlOiIsIC1sb2cxMChkb24kUCkgJT4lIHJvdW5kKDIpLCAiXG5XaGF0IGVsc2UgZG8geW91IHdhbm5hIGtub3ciLCBzZXA9IiIpCgojIE1ha2UgdGhlIHBsb3QKcCA8LSBnZ3Bsb3QoZG9uLCBhZXMoeD1CUGN1bSwgeT0tbG9nMTAoUCksIHRleHQ9dGV4dCkpICsKCiAgICAjIFNob3cgYWxsIHBvaW50cwogICAgZ2VvbV9wb2ludCggYWVzKGNvbG9yPWFzLmZhY3RvcihDSFIpKSwgYWxwaGE9MC44LCBzaXplPTEuMykgKwogICAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IHJlcChjKCJncmV5IiwgInNreWJsdWUiKSwgMjIgKSkgKwoKICAgICMgY3VzdG9tIFggYXhpczoKICAgIHNjYWxlX3hfY29udGludW91cyggbGFiZWwgPSBheGlzZGYkQ0hSLCBicmVha3M9IGF4aXNkZiRjZW50ZXIgKSArCiAgICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLCAwKSkgKyAgICAgIyByZW1vdmUgc3BhY2UgYmV0d2VlbiBwbG90IGFyZWEgYW5kIHggYXhpcwoKICAgICMgQWRkIGhpZ2hsaWdodGVkIHBvaW50cwogICAgZ2VvbV9wb2ludChkYXRhPXN1YnNldChkb24sIGlzX2hpZ2hsaWdodD09InllcyIpLCBjb2xvcj0ib3JhbmdlIiwgc2l6ZT0yKSArCgogICAgIyBDdXN0b20gdGhlIHRoZW1lOgogICAgdGhlbWVfYncoKSArCiAgICB0aGVtZSgKICAgICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIiwKICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLAogICAgICBwYW5lbC5ncmlkLm1ham9yLnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKQogICAgKQpnZ3Bsb3RseShwLCB0b29sdGlwPSJ0ZXh0IikKYGBgCgoKSXQgd2lsbCBwcm9kdWNlIHNvbWV0aGluZyBsaWtlIHRoaXMuCgohW10oaW1nL19nd2FzL2ludGVyYWN0aXZlX3Bsb3QucG5nKQoKCkFnYWluLCB0aGlzIGlzIGFuIGV4YW1wbGUgd2l0aCBkdW1teSBkYXRhIC0geW91IGNhbiB0cnkgdG8gZG8gaXQgZm9yIG91ciBHV0FTLCBidXQgY2FyZWZ1bCB3aXRoIHRoZSB0aW1lLiBZb3UgY2FuIGFsc28gY2hvb3NlIHRvIGNhcnJ5IG9uLgoKWW91IHdpbGwgZW5jb3VudGVyIHRoZSBhYm92ZSB0eXBlcyBvZiB2aXN1YWxpemF0aW9ucyBpbiBhbnkgaGlnaC1xdWFsaXR5IEdXQVMgcGFwZXIsIGJlY2F1c2UgZWFjaCBpcyBzbyBjcml0aWNhbGx5IGluZm9ybWF0aXZlLiBVc3VhbGx5LCBhbmFseXN0cyBvZiBsYXJnZS1zY2FsZSBtZXRhLWFuYWx5c2VzIG9mIEdXQVMgd2lsbCBhbHNvIHN0cmF0aWZ5IHRoZSBRUS1wbG90cyBiYXNlZCBvbiB0aGUgaW1wdXRhdGlvbiBxdWFsaXR5IChpZiB5b3VyIEdXQVMgd2FzIGltcHV0ZWQpLCBjYWxsIHJhdGUsIGFuZCBhbGxlbGUgZnJlcXVlbmN5IChhbHRob3VnaCB0aGF0IGlzIHJhcmVseSBzaGFyZWQgaW4gcHVibGljYXRpb25zLCBub3QgZXZlbiBpbiBzdXBwbGVtZW50YWwgbWF0ZXJpYWwpLgoKCiMjIFN0b3AgcGxheWluZyBhcm91bmQKCkFscmlnaHQuIEl0J3MgdGltZSB0byBzdG9wIHBsYXlpbmcgYXJvdW5kIGFuZCBkbyBhIHF1aWNrIHJlY2FwIG9mIHdoYXQgeW91J3ZlIGxlYXJuZWQuCgoxLiBZb3UgbGVhcm5lZCBob3cgdG8gY29udmVydCBkYXRhc2V0cy4KMi4gWW91IGxlYXJuZWQgaG93IHRvIGV4ZWN1dGUgc2FtcGxlIFFDIGFuZCBjcmVhdGUgZGlhZ25vc3RpYyBncmFwaGljcwozLiBZb3UgbGVhcm5lZCBob3cgdG8gZG8gdGhlIHNhbWUgZm9yIFNOUCBRQwo0LiBZb3UgbGVhcm5lZCBob3cgdG8gZXhlY3V0ZSBhbiBhc3NvY2lhdGlvbiBzdHVkeSBnaXZlbiBhIGRhdGFzZXQsIGNvdmFyaWF0ZXMsIGFuZCBkaWZmZXJlbnQgYXNzdW1wdGlvbnMgcmVnYXJkaW5nIHRoZSBnZW5ldGljIG1vZGVsLgo1LiBZb3UgbGVhcm5lZCBob3cgdG8gdmlzdWFsaXplIHJlc3VsdHMgYW5kIHBsYXllZCBhcm91bmQgd2l0aCBkaWZmZXJlbnQgdmlzdWFscy4gCgpZb3Ugc2hvdWxkIGJlIHJlYWR5IGZvciB0aGUgcmVhbCBzdHVmZi4gQW5kIGlmIG5vdCwgdGhlIG5leHQgY2hhcHRlciB3aWxsIGhlbHAgeW91IGdldCByZWFkeTogQ2hhcHRlciBcQHJlZih3dGNjYzFfaW50cm8pLgoKPCEtLSBgYGB7anMsIGVjaG8gPSBGQUxTRX0gLS0+CjwhLS0gdGl0bGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWRlcicpOyAtLT4KPCEtLSB0aXRsZS5pbm5lckhUTUwgPSAnPGltZyBzcmM9ImltZy9faGVhZGVycy9pbnRlcmFjdGl2ZV9wbG90LnBuZyIgYWx0PSJHV0FTIGJhc2ljczogdmlzdWFsaXphdGlvbiI+JyArIHRpdGxlLmlubmVySFRNTCAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tY2hhcHRlcjplbmQ6MDNfNV9nd2FzX2Jhc2ljc19yZXN1bHRzX3Zpc3VhbGl6YXRpb24uUm1kLS0+CgojIFRoZSBXZWxjb21lIFRydXN0IENhc2UtQ29udHJvbCBDb25zb3J0aXVtIHsjd3RjY2MxX2ludHJvfQo8IS0tICFbXSguL2ltZy9faGVhZGVycy9pbnRlcmFjdGl2ZV9wbG90LnBuZyl7d2lkdGg9MTAwJX0gLS0+CgoKCgoKTm93IHRoYXQgeW91IGtub3cgeW91ciB3YXkgYXJvdW5kIGBQTElOS2AsIGBiYXNoYCBhbmQgYHJgIGFuZCBoYXZlIGRvbmUgc29tZSBiYXNpYyBxdWFsaXR5IGNvbnRyb2wgYW5kIGFzc29jaWF0aW9uIHRlc3RpbmcsIHlvdSBhcmUgcmVhZHkgZm9yIHRoZSByZWFsIHRoaW5nLiBXZSBoYXZlIHByZXBhcmVkIGEgcmVhbCBkYXRhc2V0OiB0aGUgZmlyc3QgcmVsZWFzZSBvZiB0aGUgWypXZWxjb21lIFRydXN0IENhc2UtQ29udHJvbCBDb25zb3J0aXVtIChXVENDQykqXShodHRwczovL3d3dy53dGNjYy5vcmcudWsvY2NjMS9vdmVydmlldy5odG1sKXt0YXJnZXQ9Il9ibGFuayJ9IG9uIGNvcm9uYXJ5IGFydGVyeSBkaXNlYXNlIChDQUQpIGFuZCBhIGNvbnRyb2wgZGF0YXNldCB1c2VkIGZvciB0aGF0IHByb2plY3QuIAoKIyMgR2Vub3R5cGluZwoKVGhlIFdUQ0NDMSBkYXRhIHdlcmUgZ2Vub3R5cGVkIHVzaW5nIGEgY2hpcCBmcm9tIFtBZmZ5bWV0cml4XShodHRwczovL3d3dy50aGVybW9maXNoZXIuY29tL3VzL2VuL2hvbWUvbGlmZS1zY2llbmNlL21pY3JvYXJyYXktYW5hbHlzaXMvYWZmeW1ldHJpeC5odG1sP2NhdGVnb3J5PTM0MDAwJmNhdGVnb3J5SWRDbGlja2VkPTM0MDAwJnJvb3RDYXRlZ29yeUlkPTM0MDAwJm5hdk1vZGU9MzQwMDAmYUlkPXByb2R1Y3RzTmF2KXt0YXJnZXQ9Il9ibGFuayJ9LCBub3dhZGF5cyAgcGFydCBvZiBUaGVybW9GaXNoZXIuIEFzIGEgYnJhbmQgQWZmeW1ldHJpeCBzdGlsbCBleGlzdHMsIGJ1dCB0aGUgY2hpcHMgYXJlbid0IG1hZGUgYW55bW9yZS4gVW5mb3J0dW5hdGVseSwgbW9zdCBsaW5rcyB0byB0aGUgb2xkIGdlbmVyYXRpb24gQWZmeW1ldHJpeCBjaGlwcyBhcmUgYm9ya2VuLCBidXQgeW91IGNhbiBzdGlsbCBmaW5kIHNvbWUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIDUwMEsgY2hpcCB0aGF0IHdhcyB1c2VkIGZvciBbV1RDQ0MxXShodHRwczovL3Rvb2xzLnRoZXJtb2Zpc2hlci5jb20vY29udGVudC9zZnMvYnJvY2h1cmVzL3dob2xlX2dlbm9tZV9hc3NvY181MDBrX2pzbWl0aC5wZGYpe3RhcmdldD0iX2JsYW5rIn0uIEl0J3MgZ29vZCBwcmFjdGljZSB0byByZWFkIHVwIGEgYml0IG9uIHdoYXQgY2hpcCB3YXMgdXNlZCwgYW5kIHdoYXQgW3N1cHBvcnQgbWF0ZXJpYWxzIGFyZSBhdmFpbGFibGVdKGh0dHBzOi8vd3d3LnRoZXJtb2Zpc2hlci5jb20vdXMvZW4vaG9tZS9saWZlLXNjaWVuY2UvbWljcm9hcnJheS1hbmFseXNpcy9taWNyb2FycmF5LWRhdGEtYW5hbHlzaXMuaHRtbCl7dGFyZ2V0PSJfYmxhbmsifS4gCgojIyBUaGUgZGF0YQoKQmVmb3JlIHF1YWxpdHkgY29udHJvbCB0aGUgb3JpZ2luYWwgZGF0YSBpbmNsdWRlZDogCgotIENBRCBjb2hvcnQsIG4gwrEgMiwwMDAKLSBIZWFsdGh5IGNvbnRyb2xzLCBmcm9tIHRoZSBVSyAxOTU4IGJpcnRoIGNvbnRyb2wgY29ob3J0LCBuIMKxIDEsNTAwICh3ZSB3b24ndCB1c2UgdGhpcykKLSBIZWFsdGh5IGNvbnRyb2xzLCBmcm9tIHRoZSBVSyBOYXRpb25hbCBCbG9vZCBTZXJ2aWNlLCBuIMKxIDEsNTAwLgoKIyMgQXNzaWdubWVudAoKWW91ciBhc3NpZ25tZW50IGluIHRoZSBuZXh0IGNoYXB0ZXIgKENoYXB0ZXIgXEByZWYod3RjY2MxKSkgaXMgdG8gZG8gdGhlIGZvbGxvd2luZzoKCjEuIEV4cGxvcmUgdGhlIGluZGl2aWR1YWwgZGF0YXNldHMgYnkgY2FsY3VsYXRpbmcgc29tZSBzdGF0aXN0aWNzIGFuZCB2aXN1YWxpc2luZyB0aGVzZS4KMi4gTWVyZ2UgdGhlIGRhdGFzZXRzIGluIHRoZSBmb2xkZXIgYHd0Y2NjMWAuCjMuIENhbGN1bGF0ZSBQQ3MgdXNpbmcgc21hcnRQQ0EuCjQuIFBlcmZvcm0gYW4gYXNzb2NpYXRpb24gdGVzdCB1c2luZyBhdmFpbGFibGUgY292YXJpYXRlcy4gCjUuIFZpc3VhbGl6ZSB0aGUgcmVzdWx0cy4KNi4gSWRlbnRpZnkgaW5kZXBlbmRlbnQgU05Qcy4KNy4gTWFrZSByZWdpb25hbCBhc3NvY2lhdGlvbiBwbG90cy4KCgojIyBUaGVyZSB5b3UgZ28KCkFzIEkgd3JvdGUsIHlvdSBhcmUgcmVhZHkgZm9yIHRoZSByZWFsIHN0dWZmIGluIENoYXB0ZXIgXEByZWYod3RjY2MxKS4gCgo8IS0tIGBgYHtqcywgZWNobyA9IEZBTFNFfSAtLT4KPCEtLSB0aXRsZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhZGVyJyk7IC0tPgo8IS0tIHRpdGxlLmlubmVySFRNTCA9ICc8aW1nIHNyYz0iaW1nL19oZWFkZXJzL2ludGVyYWN0aXZlX3Bsb3QucG5nIiBhbHQ9IldUQ0NDMSBpbnRyb2R1Y3Rpb24iPicgKyB0aXRsZS5pbm5lckhUTUwgLS0+CjwhLS0gYGBgIC0tPgoKPCEtLWNoYXB0ZXI6ZW5kOjA0XzFfd3RjY2MxX2ludHJvLlJtZC0tPgoKIyBXVENDQzE6IGEgR1dBUyBvbiBjb3JvbmFyeSBhcnRlcnkgZGlzZWFzZSAoQ0FEKSB7I3d0Y2NjMX0KPCEtLSAhW10oLi9pbWcvX2hlYWRlcnMvaW50ZXJhY3RpdmVfcGxvdC5wbmcpe3dpZHRoPTEwMCV9IC0tPgoKCgoKCkFzIHVzdWFsLCB3ZSBzdGFydCBieSBleHBsb3JpbmcgdGhlIGRhdGEgaW4gaGFuZC4KCmBgYApwbGluayAtLWJmaWxlIHd0Y2NjMS9DQURuMTg3MV81MDBLYjM3ZndkIC0tYm1lcmdlIHd0Y2NjMS9VS0JTbjEzOTdfNTAwS2IzN2Z3ZCAtLW1ha2UtYmVkIC0tb3V0IHd0Y2NjMS93dGNjYzEgJiYgXApwbGluayAtLWJmaWxlIHd0Y2NjMS93dGNjYzEgLS1mcmVxIC0tb3V0IHd0Y2NjMS93dGNjYzEgJiYgXApwbGluayAtLWJmaWxlIHd0Y2NjMS93dGNjYzEgLS1oYXJkeSAtLW91dCB3dGNjYzEvd3RjY2MxICYmIFwKcGxpbmsgLS1iZmlsZSB3dGNjYzEvd3RjY2MxIC0tbWlzc2luZyAtLW91dCB3dGNjYzEvd3RjY2MxICYmIFwKcGxpbmsgLS1iZmlsZSB3dGNjYzEvd3RjY2MxIC0tdGVzdC1taXNzaW5nIC0tb3V0IHd0Y2NjMS93dGNjYzEKCmNhdCB3dGNjYzEvd3RjY2MxLm1pc3NpbmcgfCBhd2sgJyQ1IDwgMC4wMDAwMScgfCBhd2sgJ3sgcHJpbnQgJDIgfScgPiB3dGNjYzEvd3RjY2MxLWZhaWwtZGlmZm1pc3MtcWMudHh0CmBgYAoKCgpMZXQncyBpbnZlc3RpZ2F0ZSB0aGUgSFdFIHAtdmFsdWUgaW4gdGhlIHdob2xlIGNvaG9ydCwgYW5kIHBlciBzdHJhdHVtIChjYXNlcyBhbmQgY29udHJvbHMpIHdpdGggdGhlIGNvZGUgYmVsb3cuCgoKVGhpcyB3aWxsIHJlc3VsdCBpbiBGaWd1cmUgXEByZWYoZmlnOnNob3ctd3RjY2MxLWh3ZSkuCgo8ZGl2IGNsYXNzPSJmaWd1cmUiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPgo8aW1nIHNyYz0iaW1nL19nd2FzX3d0Y2NjL1dUQ0NDMS1IV0UucG5nIiBhbHQ9IlN0cmF0aWZpZWQgSFdFIHAtdmFsdWVzLiIgd2lkdGg9Ijg1JSIgLz4KPHAgY2xhc3M9ImNhcHRpb24iPihcI2ZpZzpzaG93LXd0Y2NjMS1od2UpU3RyYXRpZmllZCBIV0UgcC12YWx1ZXMuPC9wPgo8L2Rpdj4KCldlIHNob3VsZCBhbHNvIGluc3BlY3QgdGhlIGFsbGVsZSBmcmVxdWVuY2llcy4gTm90ZSB0aGF0IF9ieSBkZWZhdWx0XyBQTElOSyAod2hldGhlciB2MC43LCB2MS45LCBvciB2Mi4wKSBzdG9yZXMgdGhlIGFsbGVsZXMgYXMgbWlub3IgKEExKSBhbmQgbWFqb3IgKEEyKSwgYW5kIHRoZXJlZm9yZSBgLS1tYWZgIF9hbHdheXNfIGNhbGN1bGF0ZXMgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgbWlub3IgYWxsZWxlIChBMSkuCgoKVGhpcyB3aWxsIHJlc3VsdCBpbiBGaWd1cmUgXEByZWYoZmlnOnNob3ctd3RjY2MxLWZyZXEpLgoKPGRpdiBjbGFzcz0iZmlndXJlIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj4KPGltZyBzcmM9ImltZy9fZ3dhc193dGNjYy9XVENDQzEtRlJFUS5wbmciIGFsdD0iTWlub3IgYWxsZWxlIGZyZXF1ZW5jaWVzLiIgd2lkdGg9Ijg1JSIgLz4KPHAgY2xhc3M9ImNhcHRpb24iPihcI2ZpZzpzaG93LXd0Y2NjMS1mcmVxKU1pbm9yIGFsbGVsZSBmcmVxdWVuY2llcy48L3A+CjwvZGl2PgoKVGhlcmUgY291bGQgYmUgc2FtcGxlIHdpdGggdmVyeSBwb29yIG92ZXJhbGwgY2FsbCByYXRlLCB3aGVyZSBmb3IgbWFueSBTTlBzIHRoZXJlIGlzIG5vIGRhdGEuIFdlIHdpbGwgd2FudCB0byBpZGVudGlmeSB0aGVzZSBzYW1wbGVzIGFuZCBleGNsdWRlIHRoZW0uIAoKClRoaXMgd2lsbCByZXN1bHQgaW4gRmlndXJlIFxAcmVmKGZpZzpzaG93LXd0Y2NjMS1jYWxscmF0ZXNhbXBsZSkuCgo8ZGl2IGNsYXNzPSJmaWd1cmUiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPgo8aW1nIHNyYz0iaW1nL19nd2FzX3d0Y2NjL1dUQ0NDMS1jYWxscmF0ZS1zYW1wbGVzLnBuZyIgYWx0PSJQZXIgc2FtcGxlIGNhbGwgcmF0ZS4iIHdpZHRoPSI4NSUiIC8+CjxwIGNsYXNzPSJjYXB0aW9uIj4oXCNmaWc6c2hvdy13dGNjYzEtY2FsbHJhdGVzYW1wbGUpUGVyIHNhbXBsZSBjYWxsIHJhdGUuPC9wPgo8L2Rpdj4KCkxhc3RseSwgd2UgbXVzdCBpbnNwZWN0IHRoZSBwZXIgU05QIGNhbGwgcmF0ZTsgd2UgbmVlZCB0byBrbm93IGlmIHRoZXJlIGFyZSBTTlBzIHRoYXQgaGF2ZSBubyBkYXRhIGZvciBtYW55IHNhbXBsZXMuIFdlIHdpbGwgd2FudCB0byBpZGVudGlmeSBzdWNoIFNOUHMgYW5kIGV4Y2x1ZGUgdGhlc2UuCgoKClRoaXMgd2lsbCByZXN1bHQgaW4gRmlndXJlIFxAcmVmKGZpZzpzaG93LXd0Y2NjMS1jYWxscmF0ZXNucCkuCgo8ZGl2IGNsYXNzPSJmaWd1cmUiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPgo8aW1nIHNyYz0iaW1nL19nd2FzX3d0Y2NjL1dUQ0NDMS1jYWxscmF0ZS1TTlBzLnBuZyIgYWx0PSJQZXIgU05QIGNhbGwgcmF0ZS4iIHdpZHRoPSI4NSUiIC8+CjxwIGNsYXNzPSJjYXB0aW9uIj4oXCNmaWc6c2hvdy13dGNjYzEtY2FsbHJhdGVzbnApUGVyIFNOUCBjYWxsIHJhdGUuPC9wPgo8L2Rpdj4KCiMjIFF1YWxpdHkgY29udHJvbAoKTm93IHRoYXQgd2UgaGF2ZSBoYW5kbGUgb24gdGhlIGRhdGEsIHdlIGNhbiBmaWx0ZXIgaXQuIAoKPiBEbyB5b3UgaGF2ZSBhbnkgdGhvdWdodHMgb24gdGhhdD8gRG8geW91IGFncmVlIHdpdGggdGhlIGZpbHRlcnMgSSBzZXQgYmVsb3c/IEhvdyB3b3VsZCB5b3UgZG8gaXQgZGlmZmVyZW50bHkgYW5kIHdoeT8KCmBgYApwbGluayAtLWJmaWxlIHd0Y2NjMS93dGNjYzEgLS1leGNsdWRlIHd0Y2NjMS93dGNjYzEtZmFpbC1kaWZmbWlzcy1xYy50eHQgLS1tYWYgMC4wMSAtLWdlbm8gMC4wNSAtLWh3ZSAwLjAwMDAxIC0tbWFrZS1iZWQgLS1vdXQgd3RjY2MxL3d0Y2NjMV9jbGVhbgpgYGAKCiMjIEFuY2VzdHJhbCBiYWNrZ3JvdW5kCgpJZiB0aGVzZSBpbmRpdmlkdWFscyBhcmUgYWxsIGZyb20gdGhlIFVuaXRlZCBLaW5nZG9tLCB3ZSBhcmUgY2VydGFpbiB0aGVyZSB3aWxsIGJlIGFkbWl4dHVyZSBmcm9tIG90aGVyIHBvcHVsYXRpb25zIGdpdmVuIFVLJ3MgaGlzdG9yeS4gTGV0J3MgcHJvamVjdCB0aGUgV1RDQ0MxIGRhdGEgb24gMTAwMEcgcGhhc2UgMSBwb3B1bGF0aW9ucy4KCldlIHdpbGwgZmFjZSB0aGUgc2FtZSBpc3N1ZSBhcyBiZWZvcmUgd2l0aCBvdXIgZHVtbXkgZGF0YXNldCB3aXRoIHJlc3BlY3QgdG8gYEVJR0VOU09GVGAuIFNvIEkgY3JlYXRlZCB0aGUgZGF0YSBmb3IgeW91IHRvIHNraXAgdG8gdGhlIFtQbG90dGluZyBQQ0FdIHNlY3Rpb24gaW1tZWRpYXRlbHkuIFJlZ2FyZGxlc3MsIGluIHRoZSBbUHJlcGFyaW5nIFBDQV0gYW5kIFtSdW5uaW5nIFBDQV0gc2VjdGlvbnMgSSBzaG93IHlvdSBob3cgdG8gZ2V0IHRoZXJlLgoKCiMjIyBQcmVwYXJpbmcgUENBCgoqKkZpbHRlcmluZyBXVENDQzEqKgoKRm9yIFBDQSB3ZSBuZWVkIHRvIHBlcmZvcm0gZXh0cmVtZSBjbGVhbi4KCmBgYApwbGluayAtLWJmaWxlIHd0Y2NjMS93dGNjYzFfY2xlYW4gLS1tYWYgMC4xIC0tZ2VubyAwLjEgLS1pbmRlcC1wYWlyd2lzZSAxMDAgNTAgMC4yIC0tZXhjbHVkZSBzdXBwb3J0L2V4Y2x1ZGVfcHJvYmxlbWF0aWNfcmFuZ2UudHh0IC0tbWFrZS1iZWQgLS1vdXQgd3RjY2MxL3d0Y2NjMV90ZW1wCgpwbGluayAtLWJmaWxlIHd0Y2NjMS93dGNjYzFfdGVtcCAtLWV4Y2x1ZGUgd3RjY2MxL3d0Y2NjMV90ZW1wLnBydW5lLm91dCAtLW1ha2UtYmVkIC0tb3V0IHd0Y2NjMS93dGNjYzFfZXh0cmNsZWFuCgpybSAtZnYgd3RjY2MxL3d0Y2NjMV90ZW1wKgoKY2F0IHd0Y2NjMS93dGNjYzFfZXh0cmNsZWFuLmJpbSB8IGF3ayAneyBwcmludCAkMiB9JyA+IHd0Y2NjMS93dGNjYzFfZXh0cmNsZWFuLnZhcmlhbnRzLnR4dAoKY2F0IHd0Y2NjMS93dGNjYzEuYmltIHwgZ3JlcCAicnMiID4gd3RjY2MxL2FsbC52YXJpYW50cy50eHQKYGBgCgoqKk1lcmdpbmcgV1RDQ0MxIHdpdGggMTAwMEcgcGhhc2UgMSoqCgpOb3cgd2UgYXJlIHJlYWR5IHRvIGV4dHJhY3QgdGhlIFdUQ0NDMSB2YXJpYW50cyBmcm9tIHRoZSAxMDAwRyBwaGFzZSAxIHJlZmVyZW5jZQoKYGBgCnBsaW5rIC0tYmZpbGUgcmVmXzFrZ19waGFzZTFfYWxsLzFrZ19waGFzZTFfYWxsIC0tZXh0cmFjdCB3dGNjYzEvYWxsLnZhcmlhbnRzLnR4dCAtLW1ha2UtYmVkIC0tb3V0IHJlZl8xa2dfcGhhc2UxX2FsbC8xa2dfcGhhc2UxX3d0Y2NjMQpgYGAKCkV4dHJhY3RpbmcgdGhlIEEvVCBhbmQgQy9HIFNOUHMgYXMgd2VsbC4gCgpgYGAKY2F0IHJlZl8xa2dfcGhhc2UxX2FsbC8xa2dfcGhhc2UxX3d0Y2NjMS5iaW0gfCBcCmF3ayAnKCQ1ID09ICJBIiAmJiAkNiA9PSAiVCIpIHx8ICgkNSA9PSAiVCIgJiYgJDYgPT0gIkEiKSB8fCAoJDUgPT0gIkMiICYmICQ2ID09ICJHIikgfHwgKCQ1ID09ICJHIiAmJiAkNiA9PSAiQyIpJyB8IGF3ayAneyBwcmludCAkMiwgJDEsICQ0LCAkMywgJDUsICQ2IH0nIFwKPiByZWZfMWtnX3BoYXNlMV9hbGwvYWxsLjFrZ193dGNjYzEuYXRjZy52YXJpYW50cy50eHQKYGBgCgpgYGAKcGxpbmsgLS1iZmlsZSByZWZfMWtnX3BoYXNlMV9hbGwvMWtnX3BoYXNlMV93dGNjYzEgLS1leGNsdWRlIHJlZl8xa2dfcGhhc2UxX2FsbC9hbGwuMWtnX3d0Y2NjMS5hdGNnLnZhcmlhbnRzLnR4dCAtLW1ha2UtYmVkIC0tb3V0IHJlZl8xa2dfcGhhc2UxX2FsbC8xa2dfcGhhc2UxX3d0Y2NjMV9ub19hdGNnCgpwbGluayAtLWJmaWxlIHJlZl8xa2dfcGhhc2UxX2FsbC8xa2dfcGhhc2UxX3d0Y2NjMV9ub19hdGNnIC0tZXh0cmFjdCB3dGNjYzEvd3RjY2MxX2V4dHJjbGVhbi52YXJpYW50cy50eHQgLS1tYWtlLWJlZCAtLW91dCByZWZfMWtnX3BoYXNlMV9hbGwvMWtnX3BoYXNlMV9yYXdfbm9fYXRjZ193dGNjYzEKYGBgCgpGaW5hbGx5IHdlIHdpbGwgbWVyZ2UgdGhlIGRhdGFzZXRzLiAKCmBgYApwbGluayAtLWJmaWxlIHd0Y2NjMS93dGNjYzFfZXh0cmNsZWFuIC0tYm1lcmdlIHJlZl8xa2dfcGhhc2UxX2FsbC8xa2dfcGhhc2UxX3Jhd19ub19hdGNnX3d0Y2NjMSAtLW1hZiAwLjEgLS1nZW5vIDAuMSAtLWV4Y2x1ZGUgc3VwcG9ydC9leGNsdWRlX3Byb2JsZW1hdGljX3JhbmdlLnR4dCAtLW1ha2UtYmVkIC0tb3V0IHd0Y2NjMS93dGNjYzFfZXh0cmNsZWFuXzFrZwpgYGAKCiMjIyBSdW5uaW5nIFBDQQoKYGBgCmNwIC12IHd0Y2NjMS93dGNjYzFfZXh0cmNsZWFuXzFrZy5iaW0gd3RjY2MxL3d0Y2NjMV9leHRyY2xlYW5fMWtnLnBlZHNucApjcCAtdiB3dGNjYzEvd3RjY2MxX2V4dHJjbGVhbl8xa2cuZmFtIHd0Y2NjMS93dGNjYzFfZXh0cmNsZWFuXzFrZy5wZWRpbmQKYGBgCgpOb3cgdGhhdCB0aGUgY2xlYW5pbmcgaXMgZG9uZSwgd2UgY2FuIGV4ZWN1dGUgdGhlIGFjdHVhbCBQQ0EuIAoKYGBgCnBlcmwgfi9naXQvRUlHL2Jpbi9zbWFydHBjYS5wZXJsIFwKLWkgd3RjY2MxL3d0Y2NjMV9leHRyY2xlYW5fMWtnLmJlZCBcCi1hIHd0Y2NjMS93dGNjYzFfZXh0cmNsZWFuXzFrZy5wZWRzbnAgXAotYiB3dGNjYzEvd3RjY2MxX2V4dHJjbGVhbl8xa2cucGVkaW5kIFwKLWsgMTAgXAotbyB3dGNjYzEvd3RjY2MxX2V4dHJjbGVhbl8xa2cucGNhIFwKLXAgd3RjY2MxL3d0Y2NjMV9leHRyY2xlYW5fMWtnLnBsb3QgXAotZSB3dGNjYzEvd3RjY2MxX2V4dHJjbGVhbl8xa2cuZXZhbCBcCi1sIHd0Y2NjMS93dGNjYzFfZXh0cmNsZWFuXzFrZy5sb2cgXAotbSA1IFwKLXQgMTAgXAotcyA2LjAgXAotdyByZWZfMWtnX3BoYXNlMV9hbGwvMWtnLXBjYS1wb3B1bGF0aW9ucy50eHQKYGBgCgojIyMgUGxvdHRpbmcgUENBCgpJZiBhbGwgaXMgcGVhY2h5LCB5b3Ugd2VyZSBhYmxlIHRvIHJ1biB0aGUgUENBIGZvciB0aGUgV1RDQ0MxIGRhdGEgYWdhaW5zdCAxMDAwRyBwaGFzZSAxLiBVc2luZyBgc21hcnRwY2FgICh5b3Uga25vdywgYEVJR0VOU09GVGApIHdlIGhhdmUgY2FsY3VsYXRlZCBwcmluY2lwYWwgY29tcG9uZW50cyAoUENzKSBhbmQgd2UgY2FuIG5vdyBzdGFydCBwbG90dGluZyB0aGVtLiBMZXQncyBjcmVhdGUgYSBzY2F0dGVyIGRpYWdyYW0gb2YgdGhlIGZpcnN0IHR3byBwcmluY2lwYWwgY29tcG9uZW50cywgaW5jbHVkaW5nIGFsbCBpbmRpdmlkdWFscyBpbiB0aGUgZmlsZSBgd3RjY2MxX2V4dHJjbGVhbl8xa2cucGNhLmV2ZWNgICh0aGUgZmlyc3QgYW5kIHNlY29uZCBwcmluY2lwYWwgY29tcG9uZW50cyBhcmUgY29sdW1ucyAyIGFuZCAzLCByZXNwZWN0aXZlbHkpLiBVc2UgdGhlIGRhdGEgaW4gY29sdW1uIDQgdG8gY29sb3IgdGhlIHBvaW50cyBhY2NvcmRpbmcgdG8gc2FtcGxlIG9yaWdpbi4gCgo+IFBsZWFzZSBub3RlISBZb3UgbWF5IGhhdmUgYmVlbiBhYmxlIHRvIG1ha2UgYEVJR0VOU09GVGAgdG8gd29yay4gU28geW91IG1heSBoYXZlIHRvIGNoYW5nZSAiL3JlZl9wY2Ffd3RjY2MxL3d0Y2NjMV9leHRyY2xlYW5fMWtnLnBjYS5ldmVjIiB0byAiL3d0Y2NjMS93dGNjYzFfZXh0cmNsZWFuXzFrZy5wY2EuZXZlYyIgaW4gdGhlIGNvbW1hbmQgYmVsb3cuIAoKQW5kIHdlIHNob3VsZCB2aXN1YWxpemUgdGhlIFBDQSByZXN1bHRzOiBhcmUgdGhlc2UgaW5kaXZpZHVhbHMgcmVhbGx5IGFsbCBmcm9tIEV1cm9wZWFuIChVSykgYW5jZXN0cnk/IAoKCgoKCgoKCgpXZSBleHBlY3QgbW9zdCBpbmRpdmlkdWFscyBmcm9tIHRoZSBXVENDQyB0byBiZSAxMDAlIEJyaXRpc2gsIGJ1dCBhIHN1YnN0YW50aWFsIGdyb3VwIHdpbGwgaGF2ZSBhIGRpZmZlcmVudCBhbmNlc3RyYWwgYmFja2dyb3VuZCBhcyBzaG93biBpbiB0aGUgRmlndXJlIFxAcmVmKGZpZzpzaG93d3RjY2MxcGNhKSB5b3UganVzdCBtYWRlLgoKPGRpdiBjbGFzcz0iZmlndXJlIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj4KPGltZyBzcmM9ImltZy9fZ3dhc193dGNjYy9XVENDQzEtcGNhLTEwMDBnLnBuZyIgYWx0PSJQQ0EgLSBXVENDQzEgdnMuIDEwMDBHIiB3aWR0aD0iODUlIiAvPgo8cCBjbGFzcz0iY2FwdGlvbiI+KFwjZmlnOnNob3d3dGNjYzFwY2EpUENBIC0gV1RDQ0MxIHZzLiAxMDAwRzwvcD4KPC9kaXY+CgojIyMgUmVtb3Zpbmcgc2FtcGxlcwoKSW4gYSBzaW1pbGFyIGZhc2hpb24gYXMgaW4gdGhlIGV4YW1wbGUgX2d3YXNfIGFuZCBfcmF3ZGF0YV8gZGF0YXNldHMsIHlvdSBzaG91bGQgY29uc2lkZXIgdG8gKipyZW1vdmUgdGhlIHNhbXBsZXMgYmVsb3cgdGhlIHRocmVzaG9sZCoqIGJhc2VkIG9uIHRoaXMgUENBIChGaWd1cmUgXEByZWYoZmlnOnNob3d3dGNjYzFwY2EpKS4gCgo+IEdvIGFoZWFkLCB0cnkgdGhhdC4gCgpZb3UncmUgY29kZSB3b3VsZCBiZSBzb21ldGhpbmcgbGlrZSBiZWxvdzoKCmBgYApjYXQgd3RjY2MxL3d0Y2NjMV9leHRyY2xlYW5fMWtnLnBjYS5ldmVjIHwgdGFpbCAtbiArMiB8IFwKYXdrICckMyA8IDAuMDIzJyB8IGF3ayAneyBwcmludCAkMSB9JyB8IGF3ayAtRiI6IiAneyBwcmludCAkMSwgJDIgfScgPiB3dGNjYzEvZmFpbC1hbmNlc3RyeS1RQy50eHQKYGBgCgpOZXh0IHdlIGZpbHRlciB0aGVzZSBzYW1wbGVzIGFuZCBnZXQgYSBmaW5hbCBmdWxseSBRQydkIGRhdGFzZXQuCgpgYGAKcGxpbmsgLS1iZmlsZSB3dGNjYzEvd3RjY2MxX2NsZWFuIC0tZXhjbHVkZSB3dGNjYzEvZmFpbC1hbmNlc3RyeS1RQy50eHQgLS1tYWtlLWJlZCAtLW91dCB3dGNjYzEvd3RjY2MxX3FjCmBgYAoKCgojIyBBc3NvY2lhdGlvbiB0ZXN0aW5nCgpOb3cgdGhhdCB3ZSBoYXZlIGV4cGxvcmVkIHRoZSBkYXRhLCB3ZSBhcmUgcmVhZHkgZm9yIHNvbWUgc2ltcGxlIGFzc29jaWF0aW9uIHRlc3RpbmcuIEhvd2V2ZXIsIGl0IHdvdWxkIGJlIGdyZWF0IHRvIGhhdmUgc29tZSBQQ3MgdG8gY29ycmVjdCBmb3IuIFdlIGNhbiB1c2UgUExJTksgZm9yIHRoYXQgdG9vLgoKYGBgCnBsaW5rIC0tYmZpbGUgd3RjY2MxL3d0Y2NjMV9leHRyY2xlYW4gLS1leGNsdWRlIHd0Y2NjMS9mYWlsLWFuY2VzdHJ5LVFDLnR4dCAtLXBjYSAtLW91dCB3dGNjYzEvd3RjY2MxX2V4dHJjbGVhbgpgYGAKCkxldCdzIGFkZCB0aG9zZSBQQ3MgdG8gdGhlIGNvdmFyaWF0ZXMtZmlsZS4KYGBgCmVjaG8gIklJRCBQQzEgUEMyIFBDMyBQQzQgUEM1IFBDNiBQQzcgUEM4IFBDOSBQQzEwIFBDMTEgUEMxMiBQQzEzIFBDMTQgUEMxNSBQQzE2IFBDMTcgUEMxOCBQQzE5IFBDMjAiID4gd3RjY2MxL3d0Y2NjMV9xYy5wY2EKCmNhdCB3dGNjYzEvd3RjY2MxX2V4dHJjbGVhbi5laWdlbnZlYyB8IGF3ayAneyBwcmludCAkMiwkMywkNCwkNSwkNiwkNywkOCwkOSwkMTAsJDExLCQxMiwkMTMsJDE0LCQxNSwkMTYsJDE3LCQxOCwkMTksJDIwLCQyMSwkMjJ9JyA+PiB3dGNjYzEvd3RjY2MxX3FjLnBjYQoKcGVybCBzY3JpcHRzL21lcmdlVGFibGVzLnBsIC0tZmlsZTEgd3RjY2MxL3d0Y2NjMV9xYy5wY2EgLS1maWxlMiB3dGNjYzEvd3RjY2MxLmNvdmFyIC0taW5kZXggSUlEIC0tZm9ybWF0IE5PUk0gPiB3dGNjYzEvd3RjY2MxX3FjLmNvdmFyX3BjYQpgYGAKCkV4Y2l0aW5nLCBub3cgd2UgYXJlIHJlYWR5IHRvIHBlcmZvcm0gYSBHV0FTIG9uIENBRCBpbiBXVENDQzEuCgpgYGAKcGxpbmsgLS1iZmlsZSB3dGNjYzEvd3RjY2MxX3FjIC0tbG9naXN0aWMgc2V4IC0tY292YXIgd3RjY2MxL3d0Y2NjMV9xYy5jb3Zhcl9wY2EgLS1vdXQgd3RjY2MxL3d0Y2NjMV9xY19sb2dfY292YXJfcGNhCmBgYAoKQWZ0ZXIgeW91IHJhbiB0aGUgYXNzb2NpYXRpb24gYW5hbHlzaXMsIHlvdSdyZSByZWFkeSB0byBwcm9jZXNzIHRoZSBkYXRhIGFuZCB0YWtlIGEgZmlyc3QgbG9vayBhdCB0aGUgcmVzdWx0cy4gRmlyc3QsIHdlIHByZXBhcmUgdGhlIHJhdyBvdXRwdXQuIAoKCgpZb3UgY291bGQgdmlzdWFsaXplIHRoZXNlIHJlc3VsdHMgd2l0aCB0aGUgY29kZSBiZWxvdy4gCgoKClRoaXMgd291bGQgbGVhZCB0byB0aGUgZm9sbG93aW5nIGdyYXBocy4gCjxkaXYgY2xhc3M9ImZpZ3VyZSIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+CjxpbWcgc3JjPSJpbWcvX2d3YXNfd3RjY2MvV1RDQ0MxUmVzdWx0c01hbmhhdHRhbi1kZW5zaXR5LnBuZyIgYWx0PSJTTlAgZGVuc2l0eSBvZiB0aGUgYXNzb2NpYXRpb24gcmVzdWx0cy4iIHdpZHRoPSI4NSUiIC8+CjxwIGNsYXNzPSJjYXB0aW9uIj4oXCNmaWc6c2hvdy13dGNjYzEtZ3JhcGhzLWRlbnNpdHkpU05QIGRlbnNpdHkgb2YgdGhlIGFzc29jaWF0aW9uIHJlc3VsdHMuPC9wPgo8L2Rpdj4KCjxkaXYgY2xhc3M9ImZpZ3VyZSIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlciI+CjxpbWcgc3JjPSJpbWcvX2d3YXNfd3RjY2MvV1RDQ0MxUmVzdWx0c01hbmhhdHRhbi1xcS5wbmciIGFsdD0iQSBRUSBwbG90IGluY2x1ZGluZyBhIDk1JSBjb25maWRlbmNlIGludGVydmFsIChibHVlIGFyZWEpIGFuZCBnZW5vbWUtd2lkZSBzaWduaWZpY2FudCBoaXRzIChyZWQpLiIgd2lkdGg9Ijg1JSIgLz4KPHAgY2xhc3M9ImNhcHRpb24iPihcI2ZpZzpzaG93LXd0Y2NjMS1ncmFwaHMtcXEpQSBRUSBwbG90IGluY2x1ZGluZyBhIDk1JSBjb25maWRlbmNlIGludGVydmFsIChibHVlIGFyZWEpIGFuZCBnZW5vbWUtd2lkZSBzaWduaWZpY2FudCBoaXRzIChyZWQpLjwvcD4KPC9kaXY+Cgo8ZGl2IGNsYXNzPSJmaWd1cmUiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXIiPgo8aW1nIHNyYz0iaW1nL19nd2FzX3d0Y2NjL1dUQ0NDMVJlc3VsdHNNYW5oYXR0YW4tbWFuaGF0dGFuLnBuZyIgYWx0PSJBIHJlZ3VsYXIgbWFuaGF0dGFuIHBsb3QuIENvbG9yZWQgYnkgY2hyb21vc29tZSwgc3VnZ2VzdGl2ZSBoaXRzIGFyZSBncmVlbiwgZ2Vub21lLXdpZGUgaGl0cyBhcmUgcmVkLiBUaGUgYm90dG9tIGdyYXBoIHNob3dzIHRoZSBwZXItY2hyb21vc29tZSBTTlAgZGVuc2l0eS4iIHdpZHRoPSI4NSUiIC8+CjxwIGNsYXNzPSJjYXB0aW9uIj4oXCNmaWc6c2hvdy13dGNjYzEtZ3JhcGhzLW1hbmhhdHRhbilBIHJlZ3VsYXIgbWFuaGF0dGFuIHBsb3QuIENvbG9yZWQgYnkgY2hyb21vc29tZSwgc3VnZ2VzdGl2ZSBoaXRzIGFyZSBncmVlbiwgZ2Vub21lLXdpZGUgaGl0cyBhcmUgcmVkLiBUaGUgYm90dG9tIGdyYXBoIHNob3dzIHRoZSBwZXItY2hyb21vc29tZSBTTlAgZGVuc2l0eS48L3A+CjwvZGl2PgoKPGRpdiBjbGFzcz0iZmlndXJlIiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyIj4KPGltZyBzcmM9ImltZy9fZ3dhc193dGNjYy9XVENDQzFSZXN1bHRzTWFuaGF0dGFuLWNpcmN1bGFyLnBuZyIgYWx0PSJBIGNpcmN1bGFyIG1hbmhhdHRhbi4iIHdpZHRoPSI4NSUiIC8+CjxwIGNsYXNzPSJjYXB0aW9uIj4oXCNmaWc6c2hvdy13dGNjYzEtZ3JhcGhzLWNpcmN1bGFyKUEgY2lyY3VsYXIgbWFuaGF0dGFuLjwvcD4KPC9kaXY+CgojIyBSZXBsaWNhdGlvbiEgCgpZb3UgcmVhY2hlZCBhbiBpbXBvcnRhbnQgbWlsZXN0b25lLiAKCioqWW91IHJlY3JlYXRlZCB0aGUgd29yayBieSB0aGUgd2hvbGUgV1RDQ0MxLXRlYW0gdGhhdCB0b29rIHRoZW0geWVhcnMgaW4ganVzdCBvbmUgYWZ0ZXJub29uISoqIAoKV293LiBUYWtlIGEgcGF1c2UuIEFuZCByZWFsaXplIHdoYXQgeW91J3ZlIGRvbmUuIAoKQmFjayB0aGVuIHRoZXJlIHdhc24ndCBtdWNoIG9uIGFuYWx5c2VzIF9hZnRlcl8gYSBHV0FTLCBub3dhZGF5cyB0aGVyZSBhcmUgbWFueSBwb3N0LUdXQVMgYW5hbHlzZXMgbWV0aG9kcy4gV2Ugd2lsbCBjb3ZlciB0aGVtIGluIHRoZSBuZXh0IENoYXB0ZXIgXEByZWYocG9zdF9nd2FzKS4KCjwhLS0gYGBge2pzLCBlY2hvID0gRkFMU0V9IC0tPgo8IS0tIHRpdGxlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFkZXInKTsgLS0+CjwhLS0gdGl0bGUuaW5uZXJIVE1MID0gJzxpbWcgc3JjPSJpbWcvX2hlYWRlcnMvaW50ZXJhY3RpdmVfcGxvdC5wbmciIGFsdD0iV1RDQ0MxOiBjb3JvbmFyeSBhcnRlcnkgZGlzZWFzZSI+JyArIHRpdGxlLmlubmVySFRNTCAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tY2hhcHRlcjplbmQ6MDRfMl93dGNjYzEuUm1kLS0+CgojIFBvc3QtR1dBUyBBbmFseXNlcyB7I3Bvc3RfZ3dhc30KPCEtLSAhW10oLi9pbWcvX2hlYWRlcnMvYmFubmVyX21hbl9zdGFuZGluZ19kbmEucG5nKXt3aWR0aD0xMDAlfSAtLT4KCgoKCgpBIGNyaXRpY2FsIHN0ZXAgaW4gcG9zdC1HV0FTIGFuYWx5c2lzIGlzIHByb2JhYmx5ICdtYXBwaW5nIFNOUHMgdG8gZ2VuZXMnLiBJdCBpcyBjcml0aWNhbCwgYnV0IGl0IGlzIGFsc28gdGhlIG1vc3QgY2hhbGxlbmdpbmcuIF9Ib3cgZG8geW91IGV2ZW4gbWFwIFNOUHMgdG8gZ2VuZXM/XyBXaGF0IGNyaXRlcmlhIHRvIHVzZT8gU2hvdWxkIHdlIHRha2UgaW50byBhY2NvdW50IHBoeXNpY2FsIHBvc2l0aW9uPyBPciBpcyBpdCBvZiBpbnRlcmVzdCB0aGF0IGNlcnRhaW4gU05QcyBtaWdodCBpbmZsdWVuY2UgZG93bnN0cmVhbSBvciB1cHN0cmVhbSBnZW5lIGV4cHJlc3Npb24/IEFuZCB3aGF0IG9mIHRoZSBmYWN0IHRoYXQgbW9zdCBsb2NpIGRpc2NvdmVyZWQgaW4gR1dBUyBhcmUgX2ludGVyX2dlbmljPyBXaGF0IGlzIHRoZSBoZXJpdGFiaWxpdHkgb2Ygb3VyIHRyYWl0PyBBcmUgdGhlcmUgYW55IHBsZWlvdHJvcGljIGVmZmVjdHM/CgpJbiB0aGUgbmV4dCBmZXcgc2VjdGlvbnMgSSBkZWFsIHdpdGggYSBjb3VwbGUgb2YgdGhlIGRvd25zdHJlYW0sIHBvc3QtR1dBUyBhbmFseXNlcy4gV2UgZG9uJ3QgaGF2ZSB0aW1lIHRvIGdvIHByYWN0aWNhbGx5IGludG8gYSBmZXcgb2YgdGhlc2Ugc3RlcHMsIGJ1dCBJIGRvIGJlbGlldmUgaXQgaXMgaW1wb3J0YW50IHRvIHByb3ZpZGUgeW91IHdpdGggc29tZSBwb2ludGVycyB3aGVyZSB0byBzdGFydC4gCgojIyBDbHVtcGluZwoKVGhlIE1hbmhhdHRhbiBwbG90IGltbWVkaWF0ZWx5IGRyYXdzIHlvdXIgYXR0ZW50aW9uIHRvIHRoZSBwZWFrcyBhYm92ZSB0aGUgZ2Vub21lLXdpZGUgc2lnbmlmaWNhbmNlIHRocmVzaG9sZC4gKipDbHVtcGluZyoqIGlzIHRoZSBwcm9jZWR1cmUgaW4gd2hpY2ggd2UgaWRlbnRpZnkgdGhlIF9pbmRlcGVuZGVudCBoaXRzXywgdGhvc2UgdG9wIHZhcmlhbnRzIGFuZCB0aGUgdmFyaWFudHMgaW4gbGlua2FnZSBkaXNlcXVpbGlicml1bSAodGhlaXIgJ0xEIGJ1ZGRpZXMnKSBpbiB0aGUgc2FtZSBnZW5vbWljIHJlZ2lvbiAoX2xvY3VzXykuIFRoZSBiYXNpYyBzdGVwcyBhcmUgYXMgZm9sbG93cy4gRmlyc3QgZGVmaW5lIGEgdGhyZXNob2xkIGFib3ZlIHdoaWNoIHRvIGlkZW50aWZ5IHRoZSB0b3AgdmFyaWFudCwgdXN1YWxseSB0aGlzIGlzIHRoZSBnZW5vbWUtd2lkZSBzaWduaWZpY2FuY2UgdGhyZXNob2xkLiBOZXh0LCBkZWZpbmUgdGhlIG1heGltdW0gcC12YWx1ZSBvZiBhc3NvY2lhdGlvbiBhIHZhcmlhbnQgbWF5IGhhdmUgd2l0aCB0aGUgdHJhaXQgb2YgaW50ZXJlc3QuIERlZmluZSB0aGUgc3RyZW5ndGggb2YgdGhlIGNvcnJlbGF0aW9uIHRoYXQgaXMgYWxsb3dlZCBiZXR3ZWVuIHRoZSB0b3AgdmFyaWFudCBhbmQgaXRzIExEIGJ1ZGRpZXMuIEFuZCBsYXN0bHkgZGVmaW5lIHRoZSBzaXplIG9mIHJlZ2lvbiBhcm91bmQgdGhlIHRvcCB2YXJpYW50IHRvIGFzc2Vzcy4gCgoqKkNsdW1waW5nKiogY2FuIGVhc2lseSBiZSBkb25lIGluIFBMSU5LLiBBbmQgeW91IGNhbiB0b28gd2l0aCB0aGUgZHVtbXkgR1dBUyBkYXRhc2V0IGluIHRoaXMgYWRkaXRpb25hbCBjaGFwdGVyIFxAcmVmKGFkZF9jaGFwdGVyX3JlZ2lvbmFsX3Bsb3QpLiBZb3UgZG9uJ3QgaGF2ZSB0byBub3csIGl0J3MganVzdCBmb3IgZnVuLiAKCiMjIENvbmRpdGlvbmFsIGFuYWx5c2VzCgpUaGUgdmlzdWFsaXphdGlvbiBvZiBhIEdXQVMgaXMgdmVyeSBhcHBlYWxpbmcgYW5kIGRyYXdzIGF0dGVudGlvbiB0byBzaW5nbGUgcGVha3MsIGFuZCB0aGUgbW9zdCBzaWduaWZpY2FudCB2YXJpYW50LiBBbmQgd2l0aCAqKmNsdW1waW5nKiogeW91IGNhbiBpZGVudGlmeSB0aGUgaW5kZXBlbmRlbnQgc2lnbmFscywgX2kuZS5fIHRoZSB0b3AgdmFyaWFudHMgYW5kIHRoZWlyIExEIGJ1ZGRpZXMgaW4gdGhlIGxvY3VzLiBXZSBpbXBsaWNpdGx5IGFzc3VtZSB0aGF0IHRoZSB0b3AgdmFyaWFudCBjYXB0dXJlcyBhbGwgdGhlIHZhcmlhdGlvbiBpbiB0aGUgcmVnaW9uIGJ5IGl0cyBsaW5rYWdlIGRpc2VxdWlsaWJyaXVtIHdpdGggYW4gdW5rbm93biBjYXVzYWwgdmFyaWFudCwgaW4gb3RoZXIgd29yZHMgaXQgaXMgJ3RhZ2dpbmcnIHRoZSAodW4pbWVhc3VyZWQgcG90ZW50aWFsIGNhdXNhbCB2YXJpYW50IGluIHRoZSByZWdpb24uIEludHVpdGl2ZWx5IGl0IGlzIHVubGlrZWx5IHRoYXQgYSBzaW5nbGUgY2F1c2FsIHZhcmlhbnQgaXMgYWNjb3VudGluZyBmb3IgYWxsIHRoZSBMRCBiZXR3ZWVuIHRoZSB1bmtub3duIGNhdXNhbCB2YXJpYW50IGFuZCB0aGUgbWVhc3VyZWQgKGdlbm90eXBlZCBvciBpbXB1dGVkKSB2YXJpYW50cyBhdCB0aGUgbG9jdXMuIFNvLCBhIG5haXZlIGZvY3VzIG9uIG9ubHkgdGhlIHRvcCB2YXJpYW50IGlnbm9yZXMgdGhlIGZhY3QgdGhhdCBtdWx0aXBsZSBjYXVzYWwgdmFyaWFudHMgZXhpc3QgYW5kIHRodXMgdGhlIHZhcmlhdGlvbiBjYXB0dXJlZCBieSB0aGF0IHNpbmdsZSB0b3AgdmFyaWFudCB1bmRlcmVzdGltYXRlcyB0aGUgdG90YWwgdmFyaWF0aW9uIHRoYXQgY291bGQgYmUgZXhwbGFpbmVkIGJ5IHRoYXQgc2luZ2xlIHJlZ2lvbiAobG9jdXMpLgoKKipDb25kaXRpb25hbCBhbmFseXNpcyoqIGlzIGEgdG9vbCB0byBpZGVudGlmeSB0aGUgc2Vjb25kYXJ5IHZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhaXQgb2YgaW50ZXJlc3QuIFRoaXMgaW52b2x2ZXMgY29uZGl0aW9uaW5nIHRoZSBhc3NvY2lhdGlvbiBtb2RlbCAoYHRyYWl0IH4gVmFyaWFudCBYICsgY292YXJpYXRlc2ApIG9uIHRoZSBwcmltYXJ5IHZhcmlhbnQgYXNzb2NpYXRlZCBpbiB0aGF0IGxvY3VzLiBBIG1vcmUgY29tcHJlaGVuc2l2ZSBhbmQgZ2VuZXJhbCBhcHByb2FjaCB3b3VsZCBiZSB0byBjb25kaXRpb24gb24gZWFjaCB2YXJpYW50IGluIHRoZSB3aG9sZSBnZW5vbWUgc3RhcnRpbmcgd2l0aCB0aGUgdG9wIHZhcmlhbnRzIGFuZCBzdGVwd2lzZSBzZWxlY3RpbmcgYWRkaXRpb25hbCB2YXJpYW50cyBhY2NvcmRpbmcgdG8gdGhlaXIgY29uZGl0aW9uYWwgcC12YWx1ZXMuIFRoaXMgc3RyYXRlZ3kgY291bGQgcG90ZW50aWFsbHkgcmVzdWx0IGluIG11bHRpcGxlIHRvcCB2YXJpYW50cyBpbiB0aGUgc2FtZSBsb2N1cy4gSW4gb3RoZXIgd29yZHMsIGl0IGNvdWxkIHVuY292ZXIgZGlmZmVyZW50IGhhcGxvdHlwZXMgdGhhdCBhcmUgY2F1c2luZyB0aGUgc2FtZSBhc3NvY2lhdGlvbiB3aXRoIHRoZSB0cmFpdCBvZiBpbnRlcmVzdC4gCgpUaGlzIHdvdWxkIGJlIHN0cmFpZ2h0Zm9yd2FyZCB3aXRoIHN1cGVyIGNvbXB1dGVycyBhbmQgZnVsbC1hY2Nlc3MgdG8gaW5kaXZpZHVhbCBsZXZlbCBkYXRhLiBVbmZvcnR1bmF0ZWx5IHdlIG9mdGVuIGhhdmUgbmVpdGhlci4gCgpEb24ndCBkZXNwYWlyLCBhIG1ldGhvZCBleGlzdHMgdGhhdCBmaWxscyB0aGlzIGdhcC4gV2l0aCB0aGUgcHJvZ3JhbSBbR0NUQV0oaHR0cDovL2Nuc2dlbm9taWNzLmNvbS9zb2Z0d2FyZS9nY3RhLyNPdmVydmlldyl7dGFyZ2V0PSJfYmxhbmsifSB5b3UgY2FuIGV4ZWN1dGUgY29uZGl0aW9uYWwgYW5hbHlzZXMgb24gR1dBUyBzdW1tYXJ5IHN0YXRpc3RpY3MgLSB0aGUga2luZCB5b3UganVzdCBwcm9kdWNlZCB3aXRoIHRoZSBkdW1teSBkYXRhIGFuZCB3aXRoIHRoZSBXVENDQzEgZGF0YXNldCAtIGFuZCBhIHByb3BlciByZWZlcmVuY2UuIFlvdSBjYW4gcmVhZCBtb3JlIG9uIHRoaXMgaW4gW3RoZSBwYXBlcl0oaHR0cHM6Ly93d3cubmF0dXJlLmNvbS9hcnRpY2xlcy9uZy4yMjEzKXt0YXJnZXQ9Il9ibGFuayJ9LgoKRm9yIG5vdywgd2Ugd2lsbCBza2lwIHRoaXMgcGFydC4gSSB3aWxsIGFkZCBhIHdob2xlIGNoYXB0ZXIgb24gdGhpcyBhdCBzb21lIGxhdGVyIHN0YWdlLiAKCiMjIFN0YXRpc3RpY2FsIGZpbmVtYXBwaW5nCgoqKlN0YXRpc3RpY2FsIGZpbmVtYXBwaW5nKiogaXMgY2xvc2VseSByZWxhdGVkIHRvICoqY29uZGl0aW9uYWwgYW5hbHlzaXMqKi4gV2hlcmUgKipjb25kaXRpb25hbCBhbmFseXNpcyoqIGlkZW50aWZpZXMgc2Vjb25kYXJ5IHNpZ25hbHMgaW4gYSByZWdpb24gYXNzb2NpYXRlZCB0byB0aGUgdHJhaXQgb2YgaW50ZXJlc3QsICoqc3RhdGlzdGljYWwgZmluZW1hcHBpbmcqKiBhbnN3ZXJzIHRoZSBxdWVzdGlvbiAnd2hpY2ggdmFyaWFudHMgYXJlIGxpa2VseSBjYXVzYWwgdG8gdGhlIHRyYWl0PycuIEluIG1vcmUgZm9ybWFsIHdvcmRzLCB0aHJvdWdoICoqc3RhdGlzdGljYWwgZmluZW1hcHBpbmcqKiB3ZSBpZGVudGlmeSB0aGUgXzk1JSBjcmVkaWJsZSBzZXQgb2YgY2F1c2FsIHZhcmlhbnRzXy4gClRoZXJlIGFyZSBtdWx0aXBsZSBtZXRob2RzIGFuZCB0b29scyBkZXZlbG9wZWQgdG8gZ2V0IHRvIHRoaXMgYW5zd2VyLiBJIGxpc3QgYSBmZXcgYW5kIEkgZW5jb3VyYWdlIHlvdSB0byByZWFkIHVwIG9uIHRoZXNlLiAKCgojIyMgRklORU1BUAoKVGhpcyB0b29sIGlzIHZlcnkgZmFzdCBhbmQgdmVyc2F0aWxlLCBhbmQgd2FzIGRldmVsb3BlZCBieSBDaHJpc3RpYW4gQmVubmVyLiBJdCB3aWxsIGlkZW50aWZ5IHRoZSBfY3JlZGlibGUgc2V0c18gZm9yIGVhY2ggbG9jdXMgYW5kIGNhbGN1bGF0ZXMgdGhlIF9wb3N0ZXJpb3IgcHJvYmFiaWxpdGllc18gZm9yIGVhY2ggc2V0LiBUaGlzIGlzIHRoZSBtb3JlIGhhbmRzLW9uIHZlcnNpb24gb2YgZ2V0dGluZyB0byBfY3JlZGlibGUgc2V0c18uCgojIyMgTG9jdXNab29tCgpZb3UgY291bGQgdXBsb2FkIC0gcHJpdmF0ZWx5IG9yIHB1YmxpY2x5IC0geW91ciBkYXRhIHRvIFtteS5sb2N1c3pvb20ub3JnXShodHRwczovL215LmxvY3Vzem9vbS5vcmcpe3RhcmdldD0iX2JsYW5rIn0gYW5kIG9idGFpbiBhIGxpc3Qgb2YgY2F1c2FsIHZhcmlhbnRzIHdpdGggcG9zdGVyaW9yIHByb2JhYmlsaXRpZXMuIEl0IHVzZXMgYSBbc2ltcGxlIHByb2NlZHVyZV0oaHR0cHM6Ly9zdGF0Z2VuLmdpdGh1Yi5pby9nd2FzLWNyZWRpYmxlLXNldHMvbWV0aG9kL2xvY3Vzem9vbS1jcmVkaWJsZS1zZXRzLnBkZil7dGFyZ2V0PSJfYmxhbmsifSB0byBvYnRhaW4gdGhlIF9jcmVkaWJsZSBzZXRzXyB1c2luZyBbdGhlc2Ugc2NyaXB0c10oaHR0cHM6Ly9naXRodWIuY29tL3N0YXRnZW4vZ3dhcy1jcmVkaWJsZS1zZXRzLyl7dGFyZ2V0PSJfYmxhbmsifS4gVGhpcyBpcyB0aGUgbW9yZSBsYXp5IHZlcnNpb24gb2YgZ2V0dGluZyBhIGxpc3Qgb2YgbGlrZWx5IGNhdXNhbCB2YXJpYW50cy4KCiMjIyBTdVNJRQoKQW4gbGF0ZXJuYXRlIGFwcHJvYWNoIHRvIF9jcmVkaWJsZSBzZXRfIGlkZW50aWZpY2F0aW9uIGlzIHRocm91Z2ggW1N1U0lFXShodHRwczovL3N0ZXBoZW5zbGFiLmdpdGh1Yi5pby9zdXNpZVIvaW5kZXguaHRtbCl7dGFyZ2V0PSJfYmxhbmsifS4gVGhyb3VnaCBTdVNJRSB5b3UgY2FuIGlkZW50aWZ5IF9jcmVkaWJsZSBzZXRzXyB1bmRlciB0aGUgYXNzdW1wdGlvbiBvZiBtdWx0aXBsZSBjYXVzYWwgdmFyaWFudHMsIHdoZXJlYXMgKipGSU5FTUFQKiogYXNzdW1lcyBhIHNpbmdsZSBjYXVzYWwgdmFyaWFudC4KCkZvciBub3csIHdlIHdpbGwgc2tpcCB0aGlzIHBhcnQuIEkgd2lsbCBhZGQgYSB3aG9sZSBjaGFwdGVyIG9uIHRoaXMgYXQgc29tZSBsYXRlciBzdGFnZS4gCgoKIyMgRlVNQTogRlVuY3Rpb25hbCBNYXBwaW5nIGFuZCBBbm5vdGF0aW9uIG9mIEdXQVMKClJlc2VhcmNoZXJzIGZyb20gdGhlIFZVTUMgaW4gQW1zdGVyZGFtIGhhdmUgY3JlYXRlZCBhbiBvbmxpbmUgdG9vbCB0aGF0IGFpZHMgaW4gbWFwcGluZyBnZW5lcyBhbmQgZnVuY3Rpb24gdG8gR1dBUzogKiJGdW5jdGlvbmFsIE1hcHBpbmcgYW5kIEFubm90YXRpb24gb2YgR2Vub21lLVdpZGUgQXNzb2NpYXRpb24gU3R1ZGllcyIqIGEuay5hLiBbRlVNQV0oaHR0cHM6Ly9mdW1hLmN0Z2xhYi5ubCl7dGFyZ2V0PSJfYmxhbmsifS4gVGhpcyBvbmxpbmUgdG9vbCB1c2VzIGEgdmFyaWV0eSBvZiBkYXRhc2V0cyBhbmQgcHJvZ3JhbXMgdG8gcHJpb3JpdGl6ZSBnZW5lcyBhbmQgbWFwIHRoZXNlIHRvIGFzc29jaWF0ZWQgbG9jaS4gCgpXZSBoYXZlIGNvdmVyZWQgc29tZSBhc3BlY3RzIG9mIHBvc3QtR1dBUyBhbmFseXNlcywgYW5kIGEgbG90IGFyZSBjb3ZlcmVkIGJ5IEZVTUEuIExldCdzIHRyeSBhbmQgYW5ub3RhdGUgb3VyIFdUQ0NDMSByZXN1bHRzLiBUaGUgYXNzaWdubWVudCBpbiB0aGlzIGNoYXB0ZXIgXEByZWYoZnVtYSkgd2lsbCBiZSBhIGJpdCBtb3JlIF9EbyBJdCBZb3Vyc2VsZl8uCgoKIyMgUGhlbm9tZS13aWRlIGFzc29jaWF0aW9uIHN0dWR5CgpBICoqcGhlbm9tZS13aWRlIGFzc29jaWF0aW9uIHN0dWR5KiosIG9yICoqUGhlV0FTKiosIGRlYWxzIHdpdGggYXNzZXNzaW5nIHRoZSBhc3NvY2lhdGlvbiBvZiB0b3AgdmFyaWFudHMgaWRlbnRpZmllZCBpbiBHV0FTIHdpdGggb3RoZXIgdHJhaXRzLiBUaHJvdWdoIGEgKipQaGVXQVMqKiB5b3UnbGwgdG8gZ2V0IGEgbm90aW9uIHdoZXRoZXIgb24gYW55IG9mIHRoZSB0b3AgdmFyaWFudHMsIHRoZSBpbmRlcGVuZGVudCBoaXRzIGluIHlvdXIgR1dBUywgaGF2ZSBwbGVpb3Ryb3BpYyBlZmZlY3RzLiBJbiBvdGhlciB3b3Jkcywgd2hldGhlciB5b3VyIGluZGVwZW5kZW50IGhpdHMgaGF2ZSBlZmZlY3RzIG9uIG90aGVyIHRyYWl0cyB0b28uIFRoaXMgd2lsbCBwYWludCBhIHBpY3R1cmUgYXMgaXQgd2VyZSBhYm91dCB0aGUgcm9sZSB0aGUgZ2VuZXRpYyBsb2N1cyB5b3UgaWRlbnRpZmllZCBwbGF5cyBpbiBsaWZlOiBpcyBpdCB1bmlxdWUgdG8geW91ciB0cmFpdCBvciBkb2VzIGl0IGFmZmVjdCBvdGhlciB0cmFpdHMgYXMgd2VsbD8gV2hhdCBkb2VzIGl0IG1lYW4gd2hlbiB5b3VyIHRvcCB2YXJpYW50IG5lYXIgdGhlIGdlbmUgX0ZUT18gYXNzb2NpYXRlcyBub3Qgb25seSB0byBCTUksIGJ1dCBhbHNvIHRvIHR5cGUgMiBkaWFiZXRlcyBhbmQgY29yb25hcnkgYXJ0ZXJ5IGRpc2Vhc2U/ICoqUGhlV0FTKiogd2lsbCBub3QgYW5zd2VyIHRoYXQgcXVlc3Rpb24sIGJ1dCB0aGV5IGRvIGhlbHAgaW4gaW52ZW50b3J5IGFsbCB0aGUgb3RoZXIgdHJhaXRzIHRvIHdoaWNoIHlvdXIgaGl0cyBhcmUgYXNzb2NpYXRlZC4KCkFnYWluLCB3ZSdsbCBnZXQgYSBiaXQgaGFuZHMtb24gYW5kIG1vcmUgX0RvIEl0IFlvdXJzZWxmXyBpbiB0aGUgY2hhcHRlciB0aGF0IGRlYWxzIHdpdGggdGhpcy4gTGV0J3MganVtcCBvdmVyIHRvIENoYXB0ZXIgXEByZWYocGhld2FzKS4gCgojIyBDb2xvY2FsaXphdGlvbgoKRnJvbSBhbGwgb2YgdGhlIGFib3ZlIGZvbGxvd3MgYW5vdGhlciBpbnR1aXRpdmUgcXVlc3Rpb24uIFN1cHBvc2UgYSBzaWduYWwgaW4geW91ciB0cmFpdCBhbHNvIHNob3dzIGFzc29jaWF0aW9uIC0gdG8gc29tZSBleHRlbnQgLSB3aXRoIG90aGVyIHRyYWl0cy4gRG8gdGhlc2UgdHdvIHNpZ25hbHMgdGhhbiBzaWduaWZpY2FudGx5IG92ZXJsYXAsIG1vcmUgc28gdGhhbiB5b3Ugd291bGQgdGhpbmsgYmFzZWQgb24gY2hhbmNlPyAqKkNvbG9jYWxpemF0aW9uKiogZGVhbHMgd2l0aCBleGFjdGx5IHRoaXMgcXVlc3Rpb24uIAoKV2UgYXJlIG5vdCBnb2luZyB0byBkZWFsIHdpdGggKipjb2xvY2FsaXphdGlvbioqLCBidXQgYSBuaWNlIHN0YXJ0aW5nIHBvaW50IGlzIFtSQUNFUl0oaHR0cHM6Ly9naXRodWIuY29tL29saXZpYXNhYmlrL1JBQ0VSKXt0YXJnZXQ9Il9ibGFuayJ9IGFib3V0IHdoaWNoIHlvdSBjYW4gcmVhZCBtb3JlIGluIGNoYXB0ZXIgXEByZWYoYWRkX2NoYXB0ZXJfcmVnaW9uYWxfcGxvdCkuIEkgd2lsbCBhZGQgYSB3aG9sZSBjaGFwdGVyIG9uIHRoaXMgYXQgc29tZSBsYXRlciBzdGFnZS4gIAoKIyMgR2VuZXRpYyBjb3JyZWxhdGlvbgoKQmVjYXVzZSBvZiB0aGUgdW5kZXJseWluZyBiaW9sb2d5IG9yIGJlY2F1c2Ugb2YgdGhlIHdheSB0aGV5IGFyZSBtZWFzdXJlZCBvciBjYWxjdWxhdGVkLCB0cmFpdHMgY2FuIGJlIGhpZ2hseSBjb3JyZWxhdGVkIC0gcGhlbm90eXBpY2FsbHkuIFRoYXQgaXMgdG8gc2F5LCB3aGVuIHRoZSBsZXZlbHMgb2YgSERMIGFyZSBoaWdoLCBMREwgaXMgcHJvYmFibHkgbG93LCBhbmQgc28gd2hlbiB5b3UgZHJhdyBhIGNvcnJlbGF0aW9uIHBsb3QgZnJvbSBzb21lIGRhdGEgb2J0YWluZWQgaW4gYSBnZW5lcmFsIHBvcHVsYXRpb24geW91J2xsIHNlZSBhIG5pY2UgcGF0dGVybi4gQmlvbG9neSBtYXkgYWxzbyBjYXVzZSB0cmFpdHMgdG8gYmUgZ2VuZXRpY2FsbHkgY29ycmVsYXRlZDogdGhlIHNhbWUgZ2VuZXRpYyB2YXJpYW50cyBpbmZsdWVuY2UgbXVsdGlwbGUgdHJhaXRzLiBJbiBvdGhlciB3b3JkcywgaWYgYSB2YXJpYW50IGlzIGFzc29jaWF0ZWQgd2l0aCBoaWdoZXIgbGV2ZWxzIG9mIExETC1jaG9sZXN0ZXJvbCwgaXQgbWF5IGFsdGVybmF0aXZlbHkgYmUgYXNzb2NpYXRlZCB3aXRoIGxvd2VyIEhETC1jaG9sZXN0ZXJvbCwgZXRjLiBHZW5ldGljIGNvcnJlbGF0aW9uIHdpbGwgYWlkIGluIGZ1cnRoZXIgdW5kZXJzdGFuZGluZyB0aGUgcmVsYXRpb25zIGJldHdlZW4gdHJhaXRzIGJpb2xvZ2ljYWxseTogaWYgdGhlcmUgaXMgYSBzdHJvbmcgKipnZW5ldGljIGNvcnJlbGF0aW9uKiosIGl0IGlzIG1heSBiZSBkdWUgdG8gdGhlIHNhbWUgYmlvbG9naWNhbCBwYXRod2F5cyBhbmQgc28gdGhlIHRyYWl0cyBhcmUgJ2xpbmtlZCcgdGhyb3VnaCB0aGUgc2FtZSBwcm9jZXNzZXMgKG1heWJlIGNvdW50ZXItYWN0aW5nIHByb2Nlc3NlcykuIAoKPiBQdXp6bGU6IHdoYXQgb3RoZXIgcGhlbm9tZW5vbSBjb3VsZCBjYXVzZSBhIGhpZ2ggYnV0IHNwdXJpb3VzICoqZ2VuZXRpYyBjb3JyZWxhdGlvbioqPwoKV2UgYXJlIG5vdCBnb2luZyB0byBkZWFsIHdpdGggKipnZW5ldGljIGNvcnJlbGF0aW9uKiouIEkgd2lsbCBhZGQgYSB3aG9sZSBjaGFwdGVyIG9uIHRoaXMgYXQgc29tZSBsYXRlciBzdGFnZS4gIAoKIyMgQ2F1c2FsIGluZmVyZW5jZTogTWVuZGVsaWFuIFJhbmRvbWl6YXRpb24KCkluIG9ic2VydmF0aW9uYWwgc3R1ZGllcyB3ZSBtYXkgZmluZCBhIHN0cm9uZyBhc3NvY2lhdGlvbiBiZXR3ZWVuIGEgY2VydGFpbiByaXNrIGZhY3RvciBvciBiaW9tYXJrZXIgYW5kIGEgZGlzZWFzZS4gRm9yIGluc3RhbmNlLCBlcGlkZW1pb2xvZ2ljYWwgc3R1ZGllcyBzaG93IHRoYXQgaGlnaCBjaXJjdWxhdGluZyBjeXN0YXRpbiBDIGlzIGFzc29jaWF0ZWQgd2l0aCByaXNrIG9mIGNhcmRpb3Zhc2N1bGFyIGRpc2Vhc2UgKENWRCksIGluZGVwZW5kZW50IG9mIGNyZWF0aW5pbmUtYmFzZWQgcmVuYWwgZnVuY3Rpb24gbWVhc3VyZW1lbnRzW0B2YW5kZXJsYWFuMjAxNl0uIEhvd2V2ZXIsIHJlc2lkdWFsIGNvbmZvdW5kaW5nIGFuZCByZXZlcnNlIGNhdXNhbGl0eSByZW1haW4gYWx0ZXJuYXRpdmUgZXhwbGFuYXRpb25zIGZvciB0aGUgc3Ryb25nIGNvcnJlbGF0aW9uIGJldHdlZW4gY3lzdGF0aW4gQyBhbmQgQ1ZELCBib3RoIG9mIHdoaWNoIGFyZSBkaWZmaWN1bHQgdG8gdGVhc2UgYXBhcnQgZnJvbSB0cmFkaXRpb25hbCBvYnNlcnZhdGlvbmFsIChlcGlkZW1pb2xvZ2ljYWwpIHN0dWRpZXMuCgoqKk1lbmRlbGlhbiBSYW5kb21pemF0aW9uIChNUikqKiBoYXJuZXNzZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGdlbm9tZSB0byBlbmFibGUgY2F1c2FsIGluZmVyZW5jZSBvZiBhIGJpb21hcmtlci4gU3BlY2lmaWNhbGx5LCB0aGUgaW52YXJpYW50IG5hdHVyZSBvZiB0aGUgZ2Vub21lIGFuZCB0aGUgcmFuZG9tIGRpc3RyaWJ1dGlvbiBvZiBhbGxlbGVzIGZyb20gcGFyZW50cyB0byBvZmZzcHJpbmcgYXQgY29uY2VwdGlvbiBtZWFuIHRoYXQgZ2VuZXRpYyBpbmZvcm1hdGlvbiBpcyBub3QgaW5mbHVlbmNlZCBieSBkaXNlYXNlIHN0YXR1cyAocmV2ZXJzZSBjYXVzYWxpdHkpIGFuZCBzaG91bGQgYmUgZnJlZSBmcm9tIGNvbmZvdW5kaW5nIGJ5IHRyYWRpdGlvbmFsIHJpc2sgZmFjdG9yc1tAdmFuZGVybGFhbjIwMTZdLiBTbywgZ2VuZXRpYyB2YXJpYXRpb24gdGhhdCBtb2R1bGF0ZXMgc2VydW0gY29uY2VudHJhdGlvbnMgb2YgY3lzdGF0aW4gQyBjb3VsZCBzZXJ2ZSBhcyBhbiBpbnN0cnVtZW50YWwgdmFyaWFibGUgdG8gYXNzZXNzIHRoZSBlZmZlY3Qgb2YgbGlmZWxvbmcgZWxldmF0ZWQgY29uY2VudHJhdGlvbnMgb2YgY3lzdGF0aW4gQyBvbiBkaXNlYXNlIHJpc2ssIGluZGVwZW5kZW50IG9mIHBvdGVudGlhbCBjb25mb3VuZGVyc1tAdmFuZGVybGFhbjIwMTZdLgoKRmluZGluZyB0aGUgY2F1c2FsIGdlbmVzIGZvciBjb21wbGV4IGRpc2Vhc2UgaXMgYSBwcmltYXJ5IG9iamVjdGl2ZSBvZiBtYW55IHJlc2VhcmNoZXJzLCBiZWNhdXNlIHRoZXNlIGdlbmVzIGFyZSBwdXRhdGl2ZSB0aGVyYXBldXRpYyB0YXJnZXRzLiBJbiB0aGlzIGNvdXJzZSB3ZSBpbnRlbmQgdG8gZmluZCBvdXQgd2hldGhlciBUeXBlIDIgRGlhYmV0ZXMgKFQyRCkgY2F1c2VzIGNvcm9uYXJ5IGFydGVyeSBkaXNlYXNlIGFuZCBpc2NoZW1pYyBzdHJva2UuCgpUaGVyZSBpcyBhbiBlYXN5LCBxdWljay1hbmQtZGlydHkgd2F5IGFuZCBhIGhhcmRlciB3YXkuIAoKCiMjIyBNUkJhc2UKClRoZSBxdWljay1hbmQtZGlydHkgd2F5IHVzZXMgW01SQmFzZV0oaHR0cDovL3d3dy5tcmJhc2Uub3JnLyl7dGFyZ2V0PSJibGFuayJ9LiBJdCBpcyBiYXNlZCBvbiB0aGUgYFR3b1NhbXBsZU1SYCBwYWNrYWdlIGFuZCB1c2VzIHRoZSBgTVJJbnN0cnVtZW50c2AgcGFja2FnZSB0byBsb2FkIGluIGFsbCB0aGUgZ2VuZXRpYyBpbnN0cnVtZW50cy4gVGhlIGNyZWF0b3JzIG9mIE1SQmFzZSBoYXZlIGN1cmF0ZWQgaHVuZHJlZHMgb2YgR1dBUyBhbmQgbW9sZWN1bGFyIFFUTCBzdHVkaWVzLCBhbmQgcHJlcGFyZWQgdGhlIGRhdGEgZm9yIGVhc3kgdXNlIG9uIHRoZSB3ZWJzaXRlIGFuZCBpbiB0aGUgUiBwYWNrYWdlcy4KCgojIyMgVHdvU2FtcGxlTVIKClRoZSBoYXJkIHdheSBtZWFucyBnZXR0aW5nIHlvdXIgaGFuZHMgZGlydHkgYW5kIHVzaW5nIHRoZSBgVHdvU2FtcGxlTVJgIHBhY2thZ2UgeW91cnNlbGYgaW4gYFJgLiBZb3UnbGwgbGVhcm4gYWxsIHRoZSBzdGVwcyB5b3UgbmVlZCB0byB0YWtlIGludG8gYWNjb3VudCB0byBnZXQgdG8gdGhlIGFuc3dlciBvZiB0aGlzIHF1ZXN0aW9uLiBZb3UnbGwgY3JlYXRlIHRoZSBkaWFnbm9zdGljIGdyYXBocyBhbmQgY2FsY3VsYXRlIHRoZSBzdGF0aXN0aWNzLiAKCiMjIyBZb3VyIGNob2ljZQoKWW91ciBjaG9pY2UuIEluIGJvdGggY2FzZXMgeW91J2xsIGxlYXJuIGhvdyB0byBkbyBleGVjdXRlIGEgTVIsIHdoYXQgdG8gbG9vayBvdXQgZm9yIGluIHRoZSBzdGF0aXN0aWNzIGFuZCBkaWFnbm9zdGljIGdyYXBocywgYW5kIGhvdyBpbnRlcnByZXQgdGhlIHJlc3VsdHMuIFlvdXIgY2hvaWNlOiBDaGFwdGVyIFxAcmVmKG1yX21yYmFzZSkgb3IgQ2hhcHRlciBcQHJlZihtcl90d29zYW1wbGVtcikuCgpJbiBhIGZ1dHVyZSB2ZXJzaW9uIEkgd2lsbCBhaW0gdG8gaW5jbHVkZSBhIHBhcnRpYWwgcmVwbGljYXRpb24gb2YgdGhlIEN5c3RhdGluIEMgcGFwZXJbQHZhbmRlcmxhYW4yMDE2XQoKIyMgUG9seWdlbmljIHNjb3JlcwoKVW5kZXIgdGhlIGFzc3VtcHRpb24gb2YgcG9seWdlbmljaXR5LCBtYW55IHZhcmlhbnRzIHdpdGggc21hbGwgZWZmZWN0cyBjb250cmlidXRlIHRvIHRoZSBwaGVub3R5cGljIHZhcmlhdGlvbiBpbiBhIHRyYWl0IG9yIHRoZSByaXNrIHRvIGRpc2Vhc2UuIFNhbXBsZSBzaXplIGFuZCBhY2N1cmF0ZSBwaGVub3R5cGluZyBoYXZlIGEgbWFqb3IgaW1wYWN0IG9uIHRoZSBwb3dlciBvZiBhIEdXQVMuIEl0IGlzIGVzdGltYXRlZCB0aGF0IDcwJSBvZiB2YXJpYW50cyB0aGF0IHJlYWNoIDEwPHN1cD4tNjwvc3VwPiBpbiBhbiBpbml0aWFsIGRpc2NvdmVyeSBHV0FTIHdpbGwgcmVhY2ggZ2Vub21lLXdpZGUgc2lnbmlmaWNhbmNlIHdpdGggaW5jcmVhc2luZyBzYW1wbGUgc2l6ZXMuIFRoZSBpbmRpdmlkdWFsIHZhcmlhbnRzIHRoYXQgZG8gcmVhY2ggZ2Vub21lLXdpZGUgc2lnbmlmaWNhbmNlIHRoZSBmaXJzdCBvciBzZWNvbmQgdGltZSBhcm91bmQgZG8gbm90IGV4cGxhaW4gX2FsbF8gdGhlIHBoZW5vdHlwaWMgdmFyaWF0aW9uIG9yIHJlc2lkdWFsIGRpc2Vhc2Ugcmlzay4KClRvIGNhcHR1cmUgdGhlIHBvbHlnZW5pY2l0eSBvZiBhIHRyYWl0IGJleW9uZCBpbmRpdmlkdWFsIGdlbm9tZS13aWRlIHNpZ25pZmljYW50IGhpdHMsIHdlIGNhbiBjYWxjdWxhdGUgYSBwb2x5Z2VuaWMgc2NvcmUgKFBHUykuIFRoZXJlIGFyZSBzZXZlcmFsIG1ldGhvZHMgdG8gY2FsY3VsYXRlIFBHUywgYnV0IGVzc2VudGlhbGx5IGl0IGNvbWVzIGRvd24gdG8gbXVsdGlwbHlpbmcgdGhlIGVmZmVjdCBzaXplIGF0IGEgZ2l2ZW4gdmFyaWFudCB3aXRoIHRoZSBudW1iZXIgb2YgZWZmZWN0IGFsbGVsZXMgYSBnaXZlbiBpbmRpdmlkdWFsIGNhcnJpZXMuIApEZXBlbmRpbmcgb24gdGhlIG1ldGhvZCB5b3UgY2FuIHVzZSB0aGUgJ2hhcmQtY29kZWQnIGdlbm90eXBlZCBkYXRhLCBvciB0aGUgaW1wdXRlZCBkYXRhLiBJbiBjYXNlIG9mIHRoZSBsYXR0ZXIgdGhlIGVmZmVjdCBzaXplcyBhcmUgbXVsdGlwbGllZCBieSB0aGUgZ2Vub3R5cGUgcHJvYmFiaWxpdGllcyBvciBkb3NhZ2VzLCB0aGlzIGVuc3VyZXMgdGhhdCB0aGUgUEdTIHRha2VzIGludG8gYWNjb3VudCB0aGUgdW5jZXJ0YWludHkgaW50cmluc2ljIHRvIGltcHV0ZWQgZGF0YS4gCgpMZXQncyBjb25zaWRlciB0aGUgbW9zdCBpbnR1aXRpdmUgUEdTLW1ldGhvZCB3aGljaCBpcyBiYXNlZCBvbiBwLXZhbHVlIHRocmVzaG9sZGluZywgd2hpY2ggd2FzIG5pY2VseSBhcHBsaWVkIGluIHRoaXMgY2xhc3NpYyBbcGFwZXJdKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDM4L25hdHVyZTA4MTg1KXt0YXJnZXQ9Il9ibGFuayJ9LiBUaGlzIG1ldGhvZCBzZWxlY3RzIHZhcmlhbnRzIGJhc2VkIG9uIHRoZWlyIHAtdmFsdWUgYW5kIHRoYW4gY2FsY3VsYXRlcyB0aGUgUEdTLiBUaGlzIGNhbiBiZSBkb25lIHVzaW5nIGluY3JlYXNpbmdseSBsaWJlcmFsIHNpZ25pZmljYW5jZSB0aHJlc2hvbGRzIChwPHN1Yj5UPC9zdWI+KSwgZm9yIGluc3RhbmNlIHN0YXJ0aW5nIHdpdGggYWxsIHZhcmlhbnRzIHdpdGggcCA8IDEwPHN1cD4tODwvc3VwPiwgbmV4dCBwIDwgMTA8c3VwPi03PC9zdXA+LCBwIDwgMTA8c3VwPi02PC9zdXA+LCBwIDwgMTA8c3VwPi01PC9zdXA+LCBwIDwgMTA8c3VwPi00PC9zdXA+LCBwIDwgMTA8c3VwPi0zPC9zdXA+LCBwIDwgMC4wNSwgcCA8IDAuMSwgcCA8IDAuMiwgcCA8IDAuMywgcCA8IDAuNCwgcCA8IDAuNS4gVW5kZXIgdGhlIGFzc3VtcHRpb24gb2YgcG9seWdlbmljaXR5IHdlIGV4cGVjdCBhbiBpbmNyZWFzaW5nbHkgc3Ryb25nZXIgY29ycmVsYXRpb24gKHI8c3VwPjI8L3N1cD4pIG9mIHRoZSBQR1MgYXQgYSBjZXJ0YWluIHA8c3ViPlQ8L3N1Yj4gd2l0aCB0aGUgdHJhaXQgb2YgaW50ZXJlc3QuIEFub3RoZXIgYXBwbGljYXRpb24gb2YgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYnkgVmFuIFNldHRlbltAdmFuc2V0dGVuMjAxNV0uCgpMYXN0bHksIHRoZXJlIGlzIGEgZ3JlYXQgZXhwbGFuYXRvcnkgW3dlYnNpdGVdKGh0dHA6Ly9wb2x5Z2VuaWNzY29yZXMub3JnL2V4cGxhaW5lZC8pe3RhcmdldD0iX2JsYW5rIn0gb24gaG93IHRvIGNhbGN1bGF0ZSBQR1MsIGFuZCBpdCBhbHNvIHNob3dzIG9uZSBhcHBsaWNhdGlvbiBvZiBQR1MgKGFsdGhvdWdoIG11Y2ggZGViYXRlIGVuc3VlcyBhYm91dCB0aGlzIHBhcnRpY3VsYXIgYXBwbGljYXRpb24hKS4KCgojIyBXaGF0IGNvbWVzIG5leHQKCllvdSBjb21lIHRvIHRoZSBlbmQgb2YgdGhpcyBwcmFjdGljYWwgcHJpbWVyLiBXaGF0IGlzIGxlZnQgYXJlIGEgc3VtbWFyeSAobm90IHdyaXR0ZW4geWV0KSBvZiB3aGF0IHlvdSd2ZSBsZWFybmVkIGFuZCBzaG91bGQgdGFrZSBob21lLiBBbmQgc29tZSBtdXNpbmdzIGluIHRoZSBFcGlsb2d1ZSAoXEByZWYoZXBpbG9ndWUpIG9uIHRoaXMgYm9vayBhbmQgd2hhdCB0aGUgZnV0dXJlIGhvbGRzLgoKPCEtLSBgYGB7anMsIGVjaG8gPSBGQUxTRX0gLS0+CjwhLS0gdGl0bGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWRlcicpOyAtLT4KPCEtLSB0aXRsZS5pbm5lckhUTUwgPSAnPGltZyBzcmM9ImltZy9faGVhZGVycy9iYW5uZXJfbWFuX3N0YW5kaW5nX2RuYS5wbmciIGFsdD0icG9zdC1HV0FTIj4nICsgdGl0bGUuaW5uZXJIVE1MIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS1jaGFwdGVyOmVuZDowNV8xX3Bvc3RfZ3dhcy5SbWQtLT4KCiMgRnVuY3Rpb25hbCBNYXBwaW5nIGFuZCBBbm5vdGF0aW9uIG9mIEdXQVMgeyNmdW1hfQo8IS0tICFbXSguL2ltZy9faGVhZGVycy9iYW5uZXJfbWFuX3N0YW5kaW5nX2RuYS5wbmcpe3dpZHRoPTEwMCV9IC0tPgoKCgoKCiMjIEFzc2lnbm1lbnQKCiMjIyBUdXRvcmlhbAoKR28gdG8gdGhlIFtGVU1BIHdlYnNpdGVdKGh0dHBzOi8vZnVtYS5jdGdsYWIubmwpe3RhcmdldD0iX2JsYW5rIn0sIGdldCBhbiBhY2NvdW50LCBhbmQgc3R1ZHkgdGhlIFtvbmxpbmUtdHV0b3JpYWxdKGh0dHBzOi8vZnVtYS5jdGdsYWIubmwvdHV0b3JpYWwpe3RhcmdldD0iX2JsYW5rIn0uCgoKIyMjIENyZWF0ZSB0aGUgaW5wdXQKCllvdSB3aWxsIG5lZWQgdG8gdXNlIHRoZSBgZndyaXRlYCBmdW5jdGlvbiBpbiBgcmAgdG8gd3JpdGUgdGhlIGNvbmNhdGVuYXRlZCByZXN1bHRzIG9mIHRoZSBXVENDQzEgc3R1ZHkgKHJlbWVtYmVyOiBgd3RjY2MxX2Fzc29jX2NvbXBsYCkuICAKCjwhLS0gZndyaXRlKG5hLm9taXQod3RjY2MxX2Fzc29jX2NvbXBsKSwgcGFzdGUwKENPVVJTRV9sb2MsIi93dGNjYzEvd3RjY2MxX2Fzc29jX2NvbXBsLnR4dCIpLCBzZXAgPSAiICIsIHNob3dQcm9ncmVzcyA9IFRSVUUsIHZlcmJvc2UgPSBUUlVFLCBuYSA9ICJOQSIsIHJvdy5uYW1lcyA9IEZBTFNFLCBxdW90ZSA9IEZBTFNFKSAtLT4KCj4gUXVlc3Rpb246IGNhbiB5b3UgZmlndXJlIG91dCB0aGUgc2FtcGxlIHNpemUgb2YgdGhlIFdUQ0NDMSBkYXRhIHlvdSB1c2VkPwoKTWFrZSBzdXJlIHlvdSBrbm93IHdoYXQgdGhlIGNvbHVtbi1uYW1lcyBhcmUgaW4gdGhlIGZpbGUsIHlvdSdsbCBuZWVkIHRoYXQgZm9yIEZVTUEuIFlvdSBjYW4gdXNlIGBjYXQgeW91cl9maWxlIHwgaGVhZGAgdG8gZ2V0IHRoZSBmaXJzdCAxMCBsaW5lcyBvZiB0aGUgZmlsZS4KCllvdSB3aWxsIG5lZWQgdG8gY29tcHJlc3MgdGhlIHJlc3VsdGluZyBvdXRwdXQsIHRoaXMgd2lsbCBtYWtlIHVwbG9hZGluZyB0byBGVU1BIGdvIGZhc3Rlci4gWW91IGNhbiB1c2UgdGhlIGBiYXNoYC1wcm9ncmFtIGBnemlwYCBmb3IgdGhhdC4gSWYgeW91IHdhbnQgdG8ga25vdyB3aGF0IHRoZSBvcHRpb25zIGFyZSBmb3IgdGhhdCBwcm9ncmFtLCB5b3UgY2FuIHVzZSBgZ3ppcCAtaGAuCgojIyMgUnVuIEZVTUEgLSBTTlAgdG8gZ2VuZQoKVXBsb2FkIHZpYSB0aGUgZm9ybSBvbiB0aGUgRlVNQS13ZWJzaXRlLiBTaW5jZSB5b3UndmUgZG9uZSB0aGUgdHV0b3JpYWwgeW91IGFyZSBmYW1pbGlhciB3aXRoIGl0cyBvcHRpb25zLiAKClNlbGVjdCBfZXZlcnl0aGluZ18gaW4gdGhlIHRhYnMgYEdlbmUgTWFwcGluZyAocG9zaXRpb25hbCBtYXBwaW5nKWAsIGBHZW5lIE1hcHBpbmcgKGVRVEwgbWFwcGluZylgIGJ1dCAqbm90KiBgR1RFeCB2NmAgYW5kIGBHVEV4IHY3YCwgYW5kIGBHZW5lIE1hcHBpbmcgKDNEIENocm9tYXRpbiBJbnRlcmFjdGlvbiBtYXBwaW5nKWAgYW5kIGxlYXZlIHRoZSBzZXR0aW5ncyBhdCBgR2VuZSB0eXBlc2AgYW5kIGBNSEMgcmVnaW9uYCBhcy1pcy4gQXQgYE1BR01BIGFuYWx5c2lzYCBzZXQgdGhlIF9NQUdNQSBnZW5lIGV4cHJlc3Npb24gYW5hbHlzaXNfIHRvIGluY2x1ZGUgYWxsIHRpc3N1ZXMsICpidXQqIGBHVEV4IHY2YCBhbmQgYEdURXggdjdgLiAKCkRvbid0IGZvcmdldCB0byBnaXZlIHlvdXIgYW5hbHlzaXMgYSBuYW1lLiAKClRoaXMgd2lsbCB0YWtlIHNvbWUgdGltZSBhbmQgc28gaXQncyBhIGdvb2QgbW9tZW50IHRvIGNhcnJ5IG9uIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHByYWN0aWNhbCBvciB0YWtlIGEgYnJlYWssIG9yIHN0dWR5IGZvciB0aGUgZXhhbS4KCj4gUXVlc3Rpb25zCj4gCj4gMS4gSG93IG1hbnkgbGVhZCBTTlBzIGRpZCB3ZSBmaW5kPwo+IDIuIFdoYXQgZG8gdGhlIHJlc3VsdHMgb2YgTUFHTUEgKHRoZSBnZW5lLWJhc2VkIHRlc3QpIGxvb2sgbGlrZSBhbmQgaG93IG1hbnkgZ2VuZXMgcGFzcyB0aGUgdGhyZXNob2xkIG9mIG11bHRpcGxlIHRlc3RpbmcgY29ycmVjdGlvbj8KPiAzLiBIb3cgbWFueSBsb2NpIHdlcmUgbWFwcGVkPwo+IDQuIEhvdyBtYW55IGdlbmVzIHdlcmUgcGh5c2ljYWxseSBsb2NhdGVkIGFuZCBob3cgbWFueSB3ZXJlIG1hcHBlZCB0byB0aGVzZSBsb2NpPwo+IDUuIERvIHlvdSB0aGluayBhbGwgbG9jaSBhcmUgJ2NvcnJlY3QnLCBfaS5lLl8gZG8geW91ICdiZWxpZXZlJyBhbGwgdGhlIHNpZ25hbHMgbG9va2luZyBhdCB0aGUgbWFwcGluZyByZXN1bHRzPyBXaHk/Cj4gNi4gRm9yIHdoYXQgdGlzc3VlcyBhcmUgdGhlIHNpZ25hbHMgZW5yaWNoZWQ/Cj4gNy4gQXJlIHRoZXJlIGFueSBjaHJvbWF0aW4gaW50ZXJhY3Rpb25zIGRpc2NvdmVyZWQ/CgojIyMgUnVuIEZVTUEgLSBHZW5lIHRvIGZ1bmN0aW9uCgpOb3cgdGhhdCB5b3UgbWFwcGVkIFNOUHMgdG8gZ2VuZXMsIGl0J3MgdGltZSB0byBnbyBiYWNrIHRvICdNeSBKb2JzJy4gU2VsZWN0IHlvdXIgam9iIGFuZCBwZXJmb3JtIGBHRU5FMkZVTkNgLgoKPiBRdWVzdGlvbnMKPiAKPiAxLiBXaGF0IGdlbmVzIHNob3cgdGhlIGxvd2VzdCBleHByZXNzaW9uIGFjcm9zcyB0aXNzdWVzPwo+IDIuIEFuZCB3aGF0IGdlbmVzIHRoZSBoaWdoZXN0Pwo+IDMuIEZvciB3aGF0IHBhdGh3YXlzIGFyZSB0aGUgc2lnbmFscyBlbnJpY2hlZD8KPiA0LiBXaGF0IG1vbGVjdWxhciBmdW5jdGlvbnMgYXJlIG1hcHBlZCB0byB0aGUgc2lnbmFscz8KCgojIyBTb21lIGNsb3NpbmcgdGhvdWdodHMKCkZVTUEgaXMgYSBncmVhdCB0b29sLCBidXQgaXQgY29tZXMgd2l0aCBhIGNhdmVhdC4gSXQgaW5jbHVkZXMgYSBjb3VwbGUgb2YgcmVmZXJlbmNlcyBvZiB3aGljaCBpdCBpcyBub3QgcmVhZGlseSBjbGVhciB3aGljaCB2YXJpYW50cyBhcmUgaW5jbHVkZWQgLSB0aGUgYXV0aG9ycyBkbyBwcm92aWRlIHRoZSBjb2RlcyB1c2VkIG9uIEdpdCwgYnV0IHN0aWxsLCB5b3UgZG9uJ3Qga25vdyB3aGljaCB2YXJpYW50cyBwcmVjaXNlbHkgYXJlIGZpbHRlcmVkLiBUaGF0IGlzIGtleTogcGVyaGFwcyB0aGUgdG9wIHZhcmlhbnQgeW91IGRpc2NvdmVyZWQgaXMgZmlsdGVyZWQgaW4gdGhlIHJlZmVyZW5jZS4gVGhpcyBtZWFucyBGVU1BIHdpbGwgbm90IHVzZSBpdCB0byBtYXAgU05QcyB0byBnZW5lcywgcmF0aGVyIG5leHQgYmVzdCB2YXJpYW50LiBUaGlzIHNob3VsZCBiZSBpbiBoaWdoLUxEIC0gYnV0LCBhZ2FpbiwgYXNzdW1wdGlvbnMuLi4gQW5kIG9mIGNvdXJzZSwgdGhlIHJlZmVyZW5jZXMgdXNlZCBtaWdodCBub3QgbWF0Y2ggeW91ciBkYXRhIHdlbGwgZW5vdWdoLiAKU28sIG15IGFkdmljZTogdXNlIEZVTUEgKHdoeSBub3QgYmUgbGF6eSByYXRoZXIgdGhhbiB3b3JrIGhhcmQ/KSwgYnV0IGF3YXJlIG9mIHN1Y2ggY2F2ZWF0cyBhcyBJIGRlc2NyaWJlZC4gQWxsIGluIGFsbCwgSSBkbyB0aGluayBGVU1BIGlzIHZlcnkgY29tcGxldGUsIGludHVpdGl2ZSwgYW5kIGl0IG1ha2VzIHlvdXIgd29yayBwdWJsaWNhdGlvbi1yZWFkeSBiZWNhdXNlIGl0IGNyZWF0ZXMganVzdCB0aGUgcmlnaHQgZmlsZS1mb3JtYXRzIGZvciB5b3UgdG9vIChgLnBuZ2AsIGAuc3ZnYCwgYC5wZGZgLCBgLmpwZWdgKS4KClRoYXQgc2FpZCwgdGltZSB0byBtb3ZlIG9uIHRvIGluc3BlY3Qgb3RoZXIgcGhlbm90eXBlcyBpbiByZWxhdGlvbiB0byB5b3VyIGZpbmRpbmdzIGluIHRoZSBuZXh0IENoYXB0ZXIgXEByZWYocGhld2FzKSBvciB0byByZXR1cm4gdG8gdGhlIHByZXZpb3VzIGNoYXB0ZXIgb24gcG9zdC1HV0FTIGFuYWx5c2VzIFxAcmVmKHBvc3RfZ3dhcykuCgo8IS0tIGBgYHtqcywgZWNobyA9IEZBTFNFfSAtLT4KPCEtLSB0aXRsZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhZGVyJyk7IC0tPgo8IS0tIHRpdGxlLmlubmVySFRNTCA9ICc8aW1nIHNyYz0iaW1nL19oZWFkZXJzL2Jhbm5lcl9tYW5fc3RhbmRpbmdfZG5hLnBuZyIgYWx0PSJGVU1BIj4nICsgdGl0bGUuaW5uZXJIVE1MIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS1jaGFwdGVyOmVuZDowNV80X2Z1bWEuUm1kLS0+CgojIFBoZW5vbWUtV2lkZSBBc3NvY2lhdGlvbiBTdHVkeSB7I3BoZXdhc30KPCEtLSAhW10oLi9pbWcvX2d3YXMvYmFubmVyX21hbl9zdGFuZGluZ19kbmEucG5nKXt3aWR0aD03MCV9IC0tPgoKCgoKCkdpdmVuIHRoZSBsYXJnZSBiaW9iYW5rcyBhdmFpbGFibGUgbm93YWRheXMgdGhhdCBoYXZlIGFsc28gZ2Vub3R5cGVkIHRoZSBwYXJ0aWNpcGFudHMgYW5kIGNvbGxlY3RlZCBhIHZhc3QtYXJyYXkgb2YgaW5mb3JtYXRpb24gb24gdGhlbSwgaXQgaXMgcG9zc2libGUgdG8gcGVyZm9ybSBhICoqUGhlKipub21lLSoqVyoqaWRlICoqQSoqc3NvY2lhdGlvbiAqKlMqKnR1ZHkuCgpUaGVyZSBhcmUgc2V2ZXJhbCBvcHRpb25zIGluIChUYWJsZSBcQHJlZih0YWI6dGFiLXBoZXdhcykpLgoKCgoKClRhYmxlOiAoXCN0YWI6dGFiLXBoZXdhcylQaGVXQVMgUmVzb3VyY2VzLgoKfFNpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKfGh0dHBzOi8vYXRsYXMuY3RnbGFiLm5sICAgICAgICAgICAgICAgIHw0LDE1NSBHV0FTIGJhc2VkIG9uIFVLIEJpb2JhbmsgcmVsZWFzZSAyIHwKfGh0dHBzOi8vYmlvYmFua2VuZ2luZS5zdGFuZm9yZC5lZHUgICAgIHxVSyBCaW9iYW5rIGJhc2VkICAgICAgICAgICAgICAgICAgICAgICAgIHwKfGh0dHA6Ly9waGV3ZWIuc3BoLnVtaWNoLmVkdSAgICAgICAgICAgIHxVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuIEVIUi1iYXNlZCBQaGVXQVMgIHwKfGh0dHA6Ly9waGV3ZWIuc3BoLnVtaWNoLmVkdS9TQUlHRS1VS0IvIHwxLDQwMyBHV0FTIFVLIEJpb2JhbmsgYmFzZWQgICAgICAgICAgICAgIHwKfGh0dHA6Ly9waGV3YXMubXJiYXNlLm9yZyAgICAgICAgICAgICAgIHxVSyBCaW9iYW5rIGJhc2VkICAgICAgICAgICAgICAgICAgICAgICAgIHwKCgoqQXNzaWdubWVudCoKCjEuIFBlcmZvcm0gYSBQaGVXQVMgd2l0aCBhIGZldyBvZiB0aGUgcmVzb3VyY2VzIGFuZCB5b3VyIGZhdm9yaXRlIFNOUCBmcm9tIHRoaXMgdHV0b3JpYWwuIAoyLiBDb21wYXJlIHRoZSBkaWZmZXJlbnQgd2Vic2l0ZXMuIFdoYXQgZG8geW91IG5vdGljZT8KMy4gSG93IGlzIGEgUGhlV0FTIGluZm9ybWF0aXZlPwoKCiMjIFdoYXQncyBuZXh0PwoKWW91IG5vdyBrbm93IHRvIHdoYXQgb3RoZXIgdHJhaXRzLCByaXNrIGZhY3RvcnMgYW5kIGRpc2Vhc2VzIG91ciB0cmFpdCBvZiBpbnRlcmVzdCAoY29yb25hcnkgYXJ0ZXJ5IGRpc2Vhc2UpIGlzIGNvcnJlbGF0ZWQuIEFuIG9idmlvdXMgbmV4dCBxdWVzdGlvbiB3b3VsZCBiZTogaXMgdGhpcyBhIGNhdXNhbCBjb3JyZWxhdGlvbj8gV2Ugd2lsbCBjb3ZlciB0aGlzIGFzcGVjdCBpbiB0aGUgbmV4dCBDaGFwdGVyIFxAcmVmKG1lbmRlbGlhbl9yYW5kb21pemF0aW9uKSBvciB0byByZXR1cm4gdG8gdGhlIHByZXZpb3VzIGNoYXB0ZXIgb24gcG9zdC1HV0FTIGFuYWx5c2VzIFxAcmVmKHBvc3RfZ3dhcykuCgo8IS0tIGBgYHtqcywgZWNobyA9IEZBTFNFfSAtLT4KPCEtLSB0aXRsZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhZGVyJyk7IC0tPgo8IS0tIHRpdGxlLmlubmVySFRNTCA9ICc8aW1nIHNyYz0iaW1nL19oZWFkZXJzL2Jhbm5lcl9tYW5fc3RhbmRpbmdfZG5hLnBuZyIgYWx0PSJQaGVub21lLVdpZGUgQXNzb2NpYXRpb24gU3R1ZHkiPicgKyB0aXRsZS5pbm5lckhUTUwgLS0+CjwhLS0gYGBgIC0tPgoKPCEtLWNoYXB0ZXI6ZW5kOjA1XzVfcGhld2FzLlJtZC0tPgoKIyBNUkJhc2UgeyNtcl9tcmJhc2V9CjwhLS0gIVtdKC4vaW1nL19oZWFkZXJzL2Jhbm5lcl9tYW5fc3RhbmRpbmdfZG5hLnBuZyl7d2lkdGg9MTAwJX0gLS0+CgoKCgoKWW91IHRvb2sgdGhlIGVhc3kgd2F5IG91dC4gTm8gc2hhbWUgaW4gdGhhdC4gWW91ciBjaG9pY2UuIFJpZ2h0LCBzbyBhcyBJIHdyb3RlLCAqW01SQmFzZV0oaHR0cDovL3d3dy5tcmJhc2Uub3JnLyl7dGFyZ2V0PSJibGFuayJ9KiBpcyB2ZXJ5IGVhc3kgdG8gaGFuZGxlLiBJdCBpcyBiYXNlZCBvbiB0aGUgYFR3b1NhbXBsZU1SYCBwYWNrYWdlIGFuZCB1c2VzIHRoZSBgTVJJbnN0cnVtZW50c2AgcGFja2FnZSB0byBsb2FkIGluIGFsbCB0aGUgZ2VuZXRpYyBpbnN0cnVtZW50cy4gVGhlIGNyZWF0b3JzIG9mIE1SQmFzZSBoYXZlIGN1cmF0ZWQgaHVuZHJlZHMgb2YgR1dBUyBhbmQgbW9sZWN1bGFyIFFUTCBzdHVkaWVzLCBhbmQgcHJlcGFyZWQgdGhlIGRhdGEgZm9yIGVhc3kgdXNlIG9uIHRoZSB3ZWJzaXRlIGFuZCBpbiB0aGUgUiBwYWNrYWdlcy4KClVzaW5nICoqW01SQmFzZV0oaHR0cDovL3d3dy5tcmJhc2Uub3JnLyl7dGFyZ2V0PSJibGFuayJ9Kiogd2UgaW50ZW5kIHRvIGZpbmQgb3V0IHdoZXRoZXIgVHlwZSAyIERpYWJldGVzIChUMkQpIGNhdXNlcyBjb3JvbmFyeSBhcnRlcnkgZGlzZWFzZSBhbmQgaXNjaGVtaWMgc3Ryb2tlLgoKIyMgVGhlIGVuZD8KCllvdSBhcmUgYWxtb3N0IGF0IHRoZSBlbmQuIFRpbWUgdG8gcmV0dXJuIHRvIHRoZSBwcmV2aW91cyBjaGFwdGVyIG9uIHBvc3QtR1dBUyBhbmFseXNlcyBcQHJlZihwb3N0X2d3YXMpLgoKPCEtLSBgYGB7anMsIGVjaG8gPSBGQUxTRX0gLS0+CjwhLS0gdGl0bGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWRlcicpOyAtLT4KPCEtLSB0aXRsZS5pbm5lckhUTUwgPSAnPGltZyBzcmM9ImltZy9faGVhZGVycy9iYW5uZXJfbWFuX3N0YW5kaW5nX2RuYS5wbmciIGFsdD0iTVJCYXNlIj4nICsgdGl0bGUuaW5uZXJIVE1MIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS1jaGFwdGVyOmVuZDowNV82X21lbmRlbGlhbl9yYW5kb21pemF0aW9uX21yX2Jhc2UuUm1kLS0+CgojIEVwaWxvZ3VlIHsjZXBpbG9ndWV9CjwhLS0gIVtdKC4vaW1nL19oZWFkZXJzL2Jhbm5lcl9tYW5fc3RhbmRpbmdfZG5hLnBuZyl7d2lkdGg9MTAwJX0gLS0+CgoKCgoKV2hhdCBzdGFydGVkIGFzIGEgc2ltcGxlICdsZXQncyB3cml0ZSBhIHByYWN0aWNhbCBvbiBob3cgdG8gZG8gYSBHV0FTJywgZXNjYWxhdGVkIGludG8gdGhpcyBHaXRCb29rLiBNeSBzZWNvbmQgYm9vay4gTXkgZmlmdGggY2hpbGQgKGFzIGZhciBhcyBJIGtub3cpLiBJIGhvcGUgeW91IGZvdW5kIGl0IHRvIGJlIHVzZWZ1bCBhbmQgbGVhcm5lZCBhIGJpdC4gCgpUaGF0IHNhaWQsIG11Y2ggY2FuIGJlIGltcHJvdmVkIGFuZCBzbyBkb24ndCBoZXNpdGF0ZSB0byBjb250YWN0IG1lLiAKCkFzIHdpdGggYW55IHByb3BlciBlcGlsb2d1ZSBJIHNob3VsZCBub3QgZm9yZ2V0IGEgaGVhcnRmZWx0IGFuZCBob25lc3QgdGhhbmsgeW91IHRvIHRoZSByZWFkZXJzIGFuZCB1c2VycyBvZiB0aGlzIHdvcmsuIEdyYXRpdHVkZSBhbHNvIGdvZXMgdG8gbXkgZGVhciBjb2xsZWFndWVzIENoYXJsb3R0ZSBPbmxhbmQsIEplc3NpY2EgdmFuIFNldHRlbiwgYW5kIEtyaXN0ZWwgdmFuIEVpamssIGFuZCBmb3JtZXIgY29sbGVhZ3VlIFNhcmEgUHVsaXQgd2hvIGFza2VkIG1lIGJhY2sgaW4gMjAxNyB0byBqb2luIHRoZSBjb3Vyc2UgYXMgYSBsZWN0dXJlci4gSXQgaGFzIGJlZW4gYSBwbGVhc3VyZSB0byB3b3JrIHdpdGggYW5kIGxlYXJuIGZyb20geW91LCBhbmQgaXQgaGFzIGJlZW4gYSBmdW4gKGFuZCBzb21ldGltZXMgc3RyZXNzZnVsKSBleHBlcmllbmNlIHRvIHRlYWNoIHRoaXMgY291cnNlLiAKCjwhLS0gbGVjdHVyZXJzIHRocm91Z291dCB0aGUgeWVhcnMgLS0+Cgo8IS0tIEV2ZXIgc2luY2UgdGFnIHRlYW0gLS0+Cgo8IS0tIGZhbWlseSAtLT4KCjwhLS0gYGBge2pzLCBlY2hvID0gRkFMU0V9IC0tPgo8IS0tIHRpdGxlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFkZXInKTsgLS0+CjwhLS0gdGl0bGUuaW5uZXJIVE1MID0gJzxpbWcgc3JjPSJpbWcvX2hlYWRlcnMvYmFubmVyX21hbl9zdGFuZGluZ19kbmEucG5nIiBhbHQ9IkVwaWxvZ3VlIj4nICsgdGl0bGUuaW5uZXJIVE1MIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS1jaGFwdGVyOmVuZDowN19lcGlsb2d1ZS5SbWQtLT4KCiMgQWRkaXRpb25hbDogRUlHRU5TT0ZUIHsjZWlnZW5zb2Z0fQo8IS0tICFbXSguL2ltZy9fZ3dhc19kdW1teS9iYW5uZXJfbWFuX3N0YW5kaW5nX2RuYS5wbmcpe3dpZHRoPTcwJX0gLS0+CgoKCgoKVGhlcmUgdXNlZCB0byBiZSBhIHRpbWUgdGhhdCB0aGUgcHJlZmVycmVkIHNvZnR3YXJlICoqW2BFSUdFTlNPRlRgXShodHRwczovL2dpdGh1Yi5jb20vRFJlaWNoTGFiL0VJRyl7dGFyZ2U9Il9ibGFuayJ9KiogZm9yIFByaW5jaXBhbCBDb21wb25lbnQgQW5hbHlzaXMgKFBDQSkgd2FzICoqYEVJR0VOU09GVGAqKiBGb3IgbWFueSwgaXQgc3RpbGwgaXMuIEhvd2V2ZXIsICoqYEVJR0VOU09GVGAqKiBpcyBhIGJpdCBjaGFsbGVuZ2luZyB0byBtYWtlIGl0IHdvcmsgdG8gc2F5IHRoZSBsZWFzdC4gWW91IG5lZWQgdG8gaW5zdGFsbCBzb21lIHByb2dyYW1zLCBhbmQgdGhpcyBpcyBub3QgYWx3YXlzIHN0cmFpZ2h0Zm9yd2FyZC4KClNvLCBoZXJlJ3MgdGhlIGRlYWwuCgpJIHdpbGwgc2hhcmUgdGhlIGhvdy10byBmb3IgYSBtYWNPUyBlbnZpcm9ubWVudCBiZWxvdyBpbiBbRUlHRU5TT0ZUXSAtIHRoaXMgc2hvdWxkIHdvcmsgaW4gYSBMaW51eCBlbnZpcm9ubWVudCB0b28gYXMgbWFjT1MgaXMgVU5JWC1iYXNlZC4gWW91IGNhbiBjaG9vc2UgdG8gdHJ5IGFuZCBtYWtlIGl0IHdvcmsgb24geW91ciBzeXN0ZW0gKGJlIGl0IFVOSVggb3IgbWFjT1MgYmFzZWQpIGF0IGhvbWUgKG9yIGluIHRoZSBvZmZpY2UpLgoKSG93ZXZlciwgSSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIHRoZSBgLS1wY2FgIGZ1bmN0aW9uIHdoaWNoIGlzIHByZXNlbnQgaW4gYFBMSU5LYCB2MS45IGFuZCB1cC4gVGhpcyBtZWFucyB5b3Ugc2hvdWxkIHByb2JhYmx5IHNpbXBseSBza2lwIHRoaXMgc2VjdGlvbiBhbmQganVtcCBzdHJhaWdodCB0byBDaGFwdGVyIFxAcmVmKGd3YXMtYmFzaWNzLXNhbXBsZS1xYykuCgojIyBJbnN0YWxsIGhvbWVicmV3CgpZb3UgbmVlZCB0byBpbnN0YWxsIGBicmV3YCwgdGhlIG1pc3NpbmcgcGFja2FnZS1tYW5hZ2VyIGFuZCBhY2NvbXBhbnlpbmcgcGFja2FnZXMgdGhhdCBBcHBsZSBkaWRuJ3QgcHJvdmlkZS4KCmBgYAovYmluL2Jhc2ggLWMgIiQoY3VybCAtZnNTTCBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSG9tZWJyZXcvaW5zdGFsbC9IRUFEL2luc3RhbGwuc2gpIgpgYGAKCk5leHQsIGNoZWNrIHRoYXQgZXZlcnl0aGluZyBpcyBpbiBvcmRlci4KCmBgYApicmV3IGRvY3RvcgpgYGAKCiMjIEluc3RhbGwgbWlzc2luZyBwYWNrYWdlcwoKUmlnaHQsIG5vdyB0aGF0IHlvdSd2ZSBkb25lIHRoYXQsIHlvdSdyZSByZWFkeSB0byBpbnN0YWxsIGBnc2xgIGFuZCBgb3BlbmJsYXNgLgoKYGBgCmJyZXcgaW5zdGFsbCBnc2wKYnJldyBpbnN0YWxsIG9wZW5ibGFzCmBgYAoKWW91IG1heSBhbHNvIHJlcXVpcmUgYGxsdm1gIGZvciAqKmBFSUdFTlNPRlRgKiogdG8gd29yay4KCmBgYApicmV3IGluc3RhbGwgbGx2bQpgYGAKCgojIyBJbnN0YWxsaW5nIEVJR0VOU09GVAoKSSBhbSBzdGlsbCBzaGFyaW5nIHRoZSBjb2RlIHlvdSdsbCBuZWVkIC0geW91IGNvdWxkIHRyeSB0aGlzIG9uIHlvdXIgc3lzdGVtLgoKYGBgCm1rZGlyIC12ICRIT01FL2dpdApjZCAkSE9NRS9naXQKZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9EUmVpY2hMYWIvRUlHLmdpdApjZCBFSUcvc3JjCm1ha2UKbWFrZSBpbnN0YWxsCmBgYAoKPCEtLSBgYGB7anMsIGVjaG8gPSBGQUxTRX0gLS0+CjwhLS0gdGl0bGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWRlcicpOyAtLT4KPCEtLSB0aXRsZS5pbm5lckhUTUwgPSAnPGltZyBzcmM9ImltZy9faGVhZGVycy9iYW5uZXJfbWFuX3N0YW5kaW5nX2RuYS5wbmciIGFsdD0iRWlnZW5zb2Z0Ij4nICsgdGl0bGUuaW5uZXJIVE1MIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS1jaGFwdGVyOmVuZDowOF8yX2FkZF9jaGFwdGVyX2VpZ2Vuc29mdC5SbWQtLT4KCiMgQW5zd2VycyB0byB0aGUgcXVlc3Rpb25zIHsjYW5zd2Vyc30KPCEtLSAhW10oLi9pbWcvX2hlYWRlcnMvYmFubmVyX21hbl9zdGFuZGluZ19kbmEucG5nKXt3aWR0aD0xMDAlfSAtLT4KCgoKCgpUaHJvdWdob3V0IHRoZSBib29rIHlvdSBlbmNvdW50ZXJlZCBxdWVzdGlvbnMgcmVsYXRlZCB0byBzb21lIHN0ZXBzIGFuZCBvdXRwdXQgdGhhdCB5b3UgZ2VuZXJhdGVkLiBIZXJlIHlvdSBjYW4gcmV2aWV3IHRoZSBhbnN3ZXJzIGZvciBlYWNoIG9mIHRoZXNlIHF1ZXN0aW9ucyAtIG9mIGNvdXJzZSwgZm9yIHNvbWUgZGlmZmVyZW50IGFuc3dlcnMgYXJlIHBvc3NpYmxlLgoKPiBbQU5TV0VSUyBORUVEIFRPIEJFIFdPUktFRCBPVVRdCgojIyBDaGFwdGVyIDMuMTogR1dBUyBCYXNpY3MKPiBRdWVzdGlvbjogQ2FuIHlvdSB0aGluayBvZmYgd2hhdCB0aGUgJzExLDQ0MCBoZXRlcm96eWdvdXMgaGFwbG9pZCBnZW5vdHlwZXMgcHJlc2VudCcgcmVwcmVzZW50PyAKCj4gUXVlc3Rpb246IENhbiB5b3UgdGhpbmsgb2Ygb3RoZXIgc2NlbmFyaW9zIGluIHdoaWNoIHlvdSBtYXkgd2FudCB0byBleHRlbmQgdGhlIGNoZWNrIG9uIGRpZmZlcmVudGlhbCBtaXNzaW5nbmVzcyBiZXlvbmQgYSBjaGVjayBiZXR3ZWVuIGNhc2VzIGFuZCBjb250cm9scz8KICogRm9yIGluc3RhbmNlICdnZW5vdHlwaW5nIHBsYXRmb3JtJywgb3IgJ2hvc3BpdGFsIG9mIGluY2x1c2lvbicsIGlmIHlvdSB0aGluayB0aGlzIG1pZ2h0IGluZmx1ZW5jZSB0aGUgZ2Vub3R5cGluZyBleHBlcmltZW50IHRlY2huaWNhbGx5LgoKIyMgQ2hhcHRlciAzLjQ6IEdXQVMgQmFzaWNzIC0gQXNzb2NpYXRpb24gdGVzdGluZwoKPiBRdWVzdGlvbjogTG9hZCB0aGUgZGF0YSB1c2luZyBSLiBbSGludDogdXNlIGFuZCBhZGFwdCB0aGUgZXhhbXBsZXMgZnJvbSB0aGUgcHJldmlvdXMgY2hhcHRlcnMuXQoKYGBgCmxpYnJhcnkoImRhdGEudGFibGUiKQoKQ09VUlNFX2xvYyA9ICJ+L0Rlc2t0b3AvcHJhY3RpY2FsIiAjIGdldHdkKCkKCmd3YXNfSFdFIDwtIGRhdGEudGFibGU6OmZyZWFkKHBhc3RlMChDT1VSU0VfbG9jLCAiL2R1bW15X3Byb2plY3QvZ3dhLmh3ZSIpKQpnd2FzX0ZSUSA8LSBkYXRhLnRhYmxlOjpmcmVhZChwYXN0ZTAoQ09VUlNFX2xvYywgIi9kdW1teV9wcm9qZWN0L2d3YS5mcnEiKSkKZ3dhc19JTUlTUyA8LSBkYXRhLnRhYmxlOjpmcmVhZChwYXN0ZTAoQ09VUlNFX2xvYywgIi9kdW1teV9wcm9qZWN0L2d3YS5pbWlzcyIpKQpnd2FzX0xNSVNTIDwtIGRhdGEudGFibGU6OmZyZWFkKHBhc3RlMChDT1VSU0VfbG9jLCAiL2R1bW15X3Byb2plY3QvZ3dhLmxtaXNzIikpCmBgYAoKPiBRdWVzdGlvbjogUGxvdCB0aGUgcGVyLXN0cmF0dW0gSFdFIHAtdmFsdWVzIHVzaW5nIFIuIFtIaW50OiB1c2UgYW5kIGFkYXB0IHRoZSBleGFtcGxlcyBmcm9tIHRoZSBwcmV2aW91cyBjaGFwdGVycy5dCgpgYGAKbGlicmFyeSgiZ2dwdWJyIikKCmd3YXNfSFdFJGxvZ1AgPC0gLWxvZzEwKGd3YXNfSFdFJFApCgpnZ3B1YnI6OmdnaGlzdG9ncmFtKGd3YXNfSFdFLCB4ID0gImxvZ1AiLAogICAgICAgICAgICAgICAgICAgIGFkZCA9ICJtZWFuIiwKICAgICAgICAgICAgICAgICAgICBhZGQucGFyYW1zID0gbGlzdChjb2xvciA9ICIjNTk1QTVDIiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDEpLAogICAgICAgICAgICAgICAgICAgIHJ1ZyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgIyBjb2xvciA9ICIjMTI5MEQ5IiwgZmlsbCA9ICIjMTI5MEQ5IiwKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJURVNUIiwgZmlsbCA9ICJURVNUIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gImxhbmNldCIsCiAgICAgICAgICAgICAgICAgICAgZmFjZXQuYnkgPSAiVEVTVCIsCiAgICAgICAgICAgICAgICAgICAgYmlucyA9IDUwLAogICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiSFdFIC1sb2cxMChQKSIpICsKICBnZ3Bsb3QyOjpnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA1LCBsaW5ldHlwZSA9ICJkYXNoZWQiLAogICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiI0U1NTczOCIsIHNpemUgPSAxKQpnZ3Bsb3QyOjpnZ3NhdmUocGFzdGUwKENPVVJTRV9sb2MsICIvZHVtbXlfcHJvamVjdC9nd2FzLWh3ZS5wbmciKSwKICAgICAgIHBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgo+IFF1ZXN0aW9uOiBQbG90IHRoZSBhbGxlbGUgZnJlcXVlbmNpZXMgdXNpbmcgUi4gW0hpbnQ6IHVzZSBhbmQgYWRhcHQgdGhlIGV4YW1wbGVzIGZyb20gdGhlIHByZXZpb3VzIGNoYXB0ZXJzLl0KCmBgYApnZ3B1YnI6OmdnaGlzdG9ncmFtKGd3YXNfRlJRLCB4ID0gIk1BRiIsCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lYW4iLCBhZGQucGFyYW1zID0gbGlzdChjb2xvciA9ICIjNTk1QTVDIiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDEpLAogICAgICAgICAgICAgICAgICAgIHJ1ZyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAiIzEyOTBEOSIsIGZpbGwgPSAiIzEyOTBEOSIsCiAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJtaW5vciBhbGxlbGUgZnJlcXVlbmN5IikgKwogIGdncGxvdDI6Omdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAuMDUsIGxpbmV0eXBlID0gImRhc2hlZCIsCiAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICIjRTU1NzM4Iiwgc2l6ZSA9IDEpCmdncGxvdDI6Omdnc2F2ZShwYXN0ZTAoQ09VUlNFX2xvYywgIi9kdW1teV9wcm9qZWN0L2d3YXMtZnJlcS5wbmciKSwKICAgICAgIHBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgoKPiBRdWVzdGlvbjogUGxvdCB0aGUgcGVyLXNhbXBsZSBjYWxsIHJhdGVzIHVzaW5nIFIuIFtIaW50OiB1c2UgYW5kIGFkYXB0IHRoZSBleGFtcGxlcyBmcm9tIHRoZSBwcmV2aW91cyBjaGFwdGVycy5dCgpgYGAKZ3dhc19JTUlTUyRjYWxscmF0ZSA8LSAxIC0gZ3dhc19JTUlTUyRGX01JU1MKCmdncHVicjo6Z2doaXN0b2dyYW0oZ3dhc19JTUlTUywgeCA9ICJjYWxscmF0ZSIsCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lYW4iLCBhZGQucGFyYW1zID0gbGlzdChjb2xvciA9ICIjNTk1QTVDIiwgbGluZXR5cGUgPSAiZGFzaGVkIiwgc2l6ZSA9IDEpLAogICAgICAgICAgICAgICAgICAgIHJ1ZyA9IFRSVUUsIGJpbnMgPSA1MCwKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICIjMTI5MEQ5IiwgZmlsbCA9ICIjMTI5MEQ5IiwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gInBlciBzYW1wbGUgY2FsbCByYXRlIikgKwogIGdncGxvdDI6Omdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAuOTUsIGxpbmV0eXBlID0gImRhc2hlZCIsCiAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICIjRTU1NzM4Iiwgc2l6ZSA9IDEpCmdncGxvdDI6Omdnc2F2ZShwYXN0ZTAoQ09VUlNFX2xvYywgIi9kdW1teV9wcm9qZWN0L2d3YXMtc2FtcGxlLWNhbGwtcmF0ZS5wbmciKSwKICAgICAgIHBsb3QgPSBsYXN0X3Bsb3QoKSkKYGBgCgo+IFF1ZXN0aW9uOiBQbG90IHRoZSBwZXItU05QIGNhbGwgcmF0ZXMgdXNpbmcgUi4gW0hpbnQ6IHVzZSBhbmQgYWRhcHQgdGhlIGV4YW1wbGVzIGZyb20gdGhlIHByZXZpb3VzIGNoYXB0ZXJzLl0KCmBgYApnd2FzX0xNSVNTJGNhbGxyYXRlIDwtIDEgLSBnd2FzX0xNSVNTJEZfTUlTUwoKZ2dwdWJyOjpnZ2hpc3RvZ3JhbShnd2FzX0xNSVNTLCB4ID0gImNhbGxyYXRlIiwKICAgICAgICAgICAgICAgICAgICBhZGQgPSAibWVhbiIsIGFkZC5wYXJhbXMgPSBsaXN0KGNvbG9yID0gIiM1OTVBNUMiLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBzaXplID0gMSksCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwgYmlucyA9IDUwLAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIiMxMjkwRDkiLCBmaWxsID0gIiMxMjkwRDkiLAogICAgICAgICAgICAgICAgICAgIHhsYWIgPSAicGVyIFNOUCBjYWxsIHJhdGUiKSArCiAgZ2dwbG90Mjo6Z2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMC45NSwgbGluZXR5cGUgPSAiZGFzaGVkIiwKICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIiNFNTU3MzgiLCBzaXplID0gMSkKZ2dwbG90Mjo6Z2dzYXZlKHBhc3RlMChDT1VSU0VfbG9jLCAiL2R1bW15X3Byb2plY3QvZ3dhcy1zbnAtY2FsbC1yYXRlLnBuZyIpLAogICAgICAgcGxvdCA9IGxhc3RfcGxvdCgpKQpgYGAKCj4gUXVlc3Rpb246IERvIHlvdSBrbm93IHdoaWNoIG1vZGVsLCBfaS5lLl8gYFRFU1RgIGlzIG1vc3QgY29tbW9ubHkgdXNlZCBhbmQgcmVwb3J0ZWQ/IEFuZCB3aHkgaXMgdGhhdCwgZG8gdGhpbms/Cgo+IFF1ZXN0aW9uOiBIb3cgY29tZSB0aGVyZSBhcmUgbW9yZSBsaW5lcyBpbiB0aGlzIGZpbGUgdGhhbiB0aGVyZSBhcmUgdmFyaWFudHM/CiAKPiBRdWVzdGlvbjogQ2FuIHlvdSB3cml0ZSBkb3duIHRoZSBtYXRoZW1hdGljYWwgcmVsYXRpb24gYmV0d2VlbiBfYmV0YV8gYW5kIF9PUl8/CgojIyBDaGFwdGVyIDMuNTogR1dBUyB2aXN1YWxpemF0aW9uCgo+IFF1ZXN0aW9uOiBXaHkgZG8gdGhlIG51bWJlciBvZiB2YXJpYW50cyBwZXIgY2hyb3NvbWUgKGFwcHJveGltYXRlbHkpIGNvcnJlbGF0ZSB3aXRoIHRoZSBjaHJvbW9zb21lIG51bWJlcj8KCj4gUXVlc3Rpb246IFdoZXJlIGFyZSB0aGUgZGF0YSBmb3IgY2hyb21vc29tZSBYLCBZIGFuZCBNVD8KCj4gUXVlc3Rpb246IFdoYXQgZG8gdGhlIGdyZXkgc3BvdHMgb24gdGhlIGRlbnNpdHkgcGxvdCBpbmRpY2F0ZT8KCgojIyBDaGFwdGVyIDUuNDogRlVNQQoKPiBRdWVzdGlvbjogY2FuIHlvdSBmaWd1cmUgb3V0IHRoZSBzYW1wbGUgc2l6ZSBvZiB0aGUgV1RDQ0MxIGRhdGEgeW91IHVzZWQ/Cgo+IFF1ZXN0aW9ucwo+IAo+IDEuIEhvdyBtYW55IGxlYWQgU05QcyBkaWQgd2UgZmluZD8KPiAyLiBXaGF0IGRvIHRoZSByZXN1bHRzIG9mIE1BR01BICh0aGUgZ2VuZS1iYXNlZCB0ZXN0KSBsb29rIGxpa2UgYW5kIGhvdyBtYW55IGdlbmVzIHBhc3MgdGhlIHRocmVzaG9sZCBvZiBtdWx0aXBsZSB0ZXN0aW5nIGNvcnJlY3Rpb24/Cj4gMy4gSG93IG1hbnkgbG9jaSB3ZXJlIG1hcHBlZD8KPiA0LiBIb3cgbWFueSBnZW5lcyB3ZXJlIHBoeXNpY2FsbHkgbG9jYXRlZCBhbmQgaG93IG1hbnkgd2VyZSBtYXBwZWQgdG8gdGhlc2UgbG9jaT8KPiA1LiBEbyB5b3UgdGhpbmsgYWxsIGxvY2kgYXJlICdjb3JyZWN0JywgX2kuZS5fIGRvIHlvdSAnYmVsaWV2ZScgYWxsIHRoZSBzaWduYWxzIGxvb2tpbmcgYXQgdGhlIG1hcHBpbmcgcmVzdWx0cz8gV2h5Pwo+IDYuIEZvciB3aGF0IHRpc3N1ZXMgYXJlIHRoZSBzaWduYWxzIGVucmljaGVkPwo+IDcuIEFyZSB0aGVyZSBhbnkgY2hyb21hdGluIGludGVyYWN0aW9ucyBkaXNjb3ZlcmVkPwoKPiBRdWVzdGlvbnMKPiAKPiAxLiBXaGF0IGdlbmVzIHNob3cgdGhlIGxvd2VzdCBleHByZXNzaW9uIGFjcm9zcyB0aXNzdWVzPwo+IDIuIEFuZCB3aGF0IGdlbmVzIHRoZSBoaWdoZXN0Pwo+IDMuIEZvciB3aGF0IHBhdGh3YXlzIGFyZSB0aGUgc2lnbmFscyBlbnJpY2hlZD8KPiA0LiBXaGF0IG1vbGVjdWxhciBmdW5jdGlvbnMgYXJlIG1hcHBlZCB0byB0aGUgc2lnbmFscz8KCgoKPCEtLSBgYGB7anMsIGVjaG8gPSBGQUxTRX0gLS0+CjwhLS0gdGl0bGU9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWRlcicpOyAtLT4KPCEtLSB0aXRsZS5pbm5lckhUTUwgPSAnPGltZyBzcmM9ImltZy9faGVhZGVycy9iYW5uZXJfbWFuX3N0YW5kaW5nX2RuYS5wbmciIGFsdD0iQW5zd2VycyB0byBxdWVzdGlvbnMiPicgKyB0aXRsZS5pbm5lckhUTUwgLS0+CjwhLS0gYGBgIC0tPgoKPCEtLWNoYXB0ZXI6ZW5kOjA5X0Fuc3dlcnNfdG9fcXVlc3Rpb25zLlJtZC0tPgoKIyBMaWNlbnNlcyBhbmQgZGlzY2xhaW1lcnMgeyNsaWNlbnNlfQo8IS0tICFbXShpbWcvX2hlYWRlcnMvbGljZW5zZXMucG5nKXt3aWR0aD0xMDAlfSAtLT4KCgoKCgojIyBDb3B5cmlnaHQKClRoaXMgYm9vayBhbmQgYWxsIGl0cyBtYXRlcmlhbCAoImNvbnRlbnQiKSBpcyBwcm90ZWN0ZWQgYnkgY29weXJpZ2h0IHVuZGVyIER1dGNoIENvcHlyaWdodCBsYXdzIGFuZCBpcyB0aGUgcHJvcGVydHkgb2YgdGhlIGF1dGhvciBvciB0aGUgcGFydHkgY3JlZGl0ZWQgYXMgdGhlIHByb3ZpZGVyIG9mIHRoZSBjb250ZW50LiBZb3UgbWF5IG5vdCBjb3B5LCByZXByb2R1Y2UsIGRpc3RyaWJ1dGUsIHB1Ymxpc2gsIGRpc3BsYXksIHBlcmZvcm0sIG1vZGlmeSwgY3JlYXRlIGRlcml2YXRpdmUgd29ya3MsIHRyYW5zbWl0LCBvciBpbiBhbnkgd2F5IGV4cGxvaXQgYW55IHN1Y2ggY29udGVudCwgbm9yIG1heSB5b3UgZGlzdHJpYnV0ZSBhbnkgcGFydCBvZiB0aGlzIGNvbnRlbnQgb3ZlciBhbnkgbmV0d29yaywgaW5jbHVkaW5nIGEgbG9jYWwgYXJlYSBuZXR3b3JrLCBzZWxsIG9yIG9mZmVyIGl0IGZvciBzYWxlLCBvciB1c2Ugc3VjaCBjb250ZW50IHRvIGNvbnN0cnVjdCBhbnkga2luZCBvZiBkYXRhYmFzZS4gWW91IG1heSBub3QgYWx0ZXIgb3IgcmVtb3ZlIGFueSBjb3B5cmlnaHQgb3Igb3RoZXIgbm90aWNlIGZyb20gY29waWVzIG9mIHRoZSBjb250ZW50IG9uIHRoaXMgd2Vic2l0ZS4gQ29weWluZyBvciBzdG9yaW5nIGFueSBjb250ZW50IGV4Y2VwdCBhcyBwcm92aWRlZCBhYm92ZSBpcyBleHByZXNzbHkgcHJvaGliaXRlZCB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgYXV0aG9yIG9yIHRoZSBjb3B5cmlnaHQgaG9sZGVyIGlkZW50aWZpZWQgaW4gdGhlIGluZGl2aWR1YWwgY29udGVudCdzIGNvcHlyaWdodCBub3RpY2UuIEZvciBwZXJtaXNzaW9uIHRvIHVzZSB0aGlzIGNvbnRlbnQsIHBsZWFzZSBjb250YWN0IHRoZSBhdXRob3IuCgojIyBEaXNjbGFpbWVyCgpUaGUgY29udGVudCBjb250YWluZWQgaGVyZWluIGlzIHByb3ZpZGVkIG9ubHkgZm9yIGVkdWNhdGlvbmFsIGFuZCBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9yIGFzIHJlcXVpcmVkIGJ5IER1dGNoIGxhdy4gVGhlIGF1dGhvciBhdHRlbXB0ZWQgdG8gZW5zdXJlIHRoYXQgY29udGVudCBpcyBhY2N1cmF0ZSBhbmQgb2J0YWluZWQgZnJvbSByZWxpYWJsZSBzb3VyY2VzLCBidXQgZG9lcyBub3QgcmVwcmVzZW50IGl0IHRvIGJlIGVycm9yLWZyZWUuIFRoZSBhdXRob3IgbWF5IGFkZCwgYW1lbmQgb3IgcmVwZWFsIGFueSB0ZXh0LCBwcm9jZWR1cmUgb3IgcmVndWxhdGlvbiwgYW5kIGZhaWx1cmUgdG8gdGltZWx5IHBvc3Qgc3VjaCBjaGFuZ2VzIHRvIHRoaXMgYm9vayBzaGFsbCBub3QgYmUgY29uc3RydWVkIGFzIGEgd2FpdmVyIG9mIGVuZm9yY2VtZW50LiBUaGUgYXV0aG9yIGRvZXMgbm90IHdhcnJhbnQgdGhhdCBhbnkgZnVuY3Rpb25zIG9uIHRoaXMgd2Vic2l0ZSBvciB0aGUgY29udGVudHMgYW5kIHJlZmVyZW5jZXMgaGVyZWluIHdpbGwgYmUgdW5pbnRlcnJ1cHRlZCwgdGhhdCBkZWZlY3RzIHdpbGwgYmUgY29ycmVjdGVkLCBvciB0aGF0IHRoaXMgd2Vic2l0ZSBvciB0aGUgY29udGVudHMgYW5kIHJlZmVyZW5jZXMgd2lsbCBiZSBmcmVlIGZyb20gdmlydXNlcyBvciBvdGhlciBoYXJtZnVsIGNvbXBvbmVudHMuIEFueSBsaW5rcyB0byB0aGlyZCBwYXJ0eSBpbmZvcm1hdGlvbiBvbiB0aGUgYXV0aG9y4oCZcyB3ZWJzaXRlIGFyZSBwcm92aWRlZCBhcyBhIGNvdXJ0ZXN5IGFuZCBkbyBub3QgY29uc3RpdHV0ZSBhbiBlbmRvcnNlbWVudCBvZiB0aG9zZSBtYXRlcmlhbHMgb3IgdGhlIHRoaXJkIHBhcnR5IHByb3ZpZGluZyB0aGVtLgoKIyMgSW1hZ2VzIGFuZCBkYXRhIHVzZWQKCkkgdG9vayB0aGUgYXQtbW9zdCBjYXJlIHRvIHVzZSByZWZlciB0byB0aGUgb3JpZ2luYWwgd29ya3MgYW5kIGRhdGEgc291cmNlcyB3aGVyZSBuZWVkZWQuIExpa2V3aXNlLCBhbGwgdGhlIGltYWdlcyBjLnEuIGZpZ3VyZXMgYXJlIGVpdGhlciBwcm9kdWNlZCBzcGVjaWZpY2FsbHkgZm9yIHRoaXMgYm9vaywgb3IgSSB0b29rIHRoZW0gZnJvbSBbKipVbnNwbGFzaCoqXShodHRwczovL3Vuc3BsYXNoLmNvbS9zL3Bob3Rvcy9sZWdhbCkgdG8gYnJpZ2h0ZW4gdXAgdGhlIGJvb2suIElmIHlvdSBmZWVsIEkgbWFkZSBhIG1pc3Rha2UgYW5kIHlvdXIgd29yayBzaG91bGQgYmUgcHJvcGVybHkgcmVmZXJlbmNlZCwgcGxlYXNlIGRvbid0IGhlc2l0YXRlIHRvIGNvbnRhY3QgbWUuIAoKVGhlc2UgYXJlIHRoZSBpbWFnZXMgZnJvbSAqKlVuc3BsYXNoKiogbGlzdGVkIGhlcmUgaW4gbm8gcGFydGljdWxhciBvcmRlci4KCi0gcGFwZXJzX29uX3dhbGwgLSBodHRwczovL3Vuc3BsYXNoLmNvbS9waG90b3Mvb3Blbi1ib29rLWxvdC1PYXFrN3FxTmhfYwotIHdvbWVuX2JlaGluZF9tYWNib29rIC0gaHR0cHM6Ly91bnNwbGFzaC5jb20vcGhvdG9zL3dvbWFuLXVzaW5nLW1hY2Jvb2stcHJvLXdpdGgtcGVyc29uLWluLXdoaXRlLXRvcC1iUFZNNG5PeTBSZwotIHdvbWFuX3dvcmtpbmdfb25fY29kZSAtIGh0dHBzOi8vdW5zcGxhc2guY29tL3Bob3Rvcy93b21hbi13ZWFyaW5nLWJsYWNrLXQtc2hpcnQtaG9sZGluZy13aGl0ZS1jb21wdXRlci1rZXlib2FyZC1ZSzBIUHdXREoxSQotIGxpY2Vuc2VzIC0gaHR0cHM6Ly91bnNwbGFzaC5jb20vcGhvdG9zL2Jvb2stbG90LW9uLWJsYWNrLXdvb2Rlbi1zaGVsZi16ZUgtbGphd0h0ZwoKIyMgQ29weXJpZ2h0CgpDb3B5cmlnaHQgMTk3OS0yMDI0LiBBbGwgcmlnaHRzIHJlc2VydmVkLiBTYW5kZXIgVy4gdmFuIGRlciBMYWFuIHwgW3Mudy52YW5kZXJsYWFuIFthdF0gZ21haWwuY29tXShtYWlsdG86cy53LnZhbmRlcmxhYW5AZ21haWwuY29tKSB8IFtodHRwczovL3ZhbmRlcmxhYW5hbmQuc2NpZW5jZV0oaHR0cHM6Ly92YW5kZXJsYWFuYW5kLnNjaWVuY2Upe3RhcmdldD0iX2JsYW5rIn0uIFB1Ymxpc2hlZCB3aXRoIFtgYm9va2Rvd25gXShodHRwczovL2Jvb2tkb3duLm9yZy95aWh1aS9ib29rZG93bi8pe3RhcmdldD0iX2JsYW5rIn0uCgo8IS0tIGBgYHtqcywgZWNobyA9IEZBTFNFfSAtLT4KPCEtLSB0aXRsZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhZGVyJyk7IC0tPgo8IS0tIHRpdGxlLmlubmVySFRNTCA9ICc8aW1nIHNyYz0iaW1nL19oZWFkZXJzL2Jhbm5lcl9tYW5fc3RhbmRpbmdfZG5hLnBuZyIgYWx0PSJMaWNlbnNlcyI+JyArIHRpdGxlLmlubmVySFRNTCAtLT4KPCEtLSBgYGAgLS0+Cgo8IS0tY2hhcHRlcjplbmQ6MTFfbGljZW5zZXMuUm1kLS0+CgojIENvbG9waG9uCgoKCgoKVGhlIDIwMjIgYW5kIDIwMjQgZWRpdGlvbnMgb2YgdGhpcyBib29rIHdlcmUgcHJvZHVjZSBpbiBSU3R1ZGlvIGFuZCB3aXRoIHRoZSBgYm9va2Rvd25gIHBhY2thZ2UuIEJlbG93IGEgbGlzdGluZyBvZiBpbnN0YWxsZWQgcHJvZ3JhbXMgYW5kIGxpYnJhcmllcywgdGhlIG9wZXJhdGluZyBzeXN0ZW0sIGFuZCB0aGVpciBzcGVjaWZpYyB2ZXJzaW9ucy4KCgpgYGAKIyMg4pSAIFNlc3Npb24gaW5mbyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKIyMgIHNldHRpbmcgIHZhbHVlCiMjICB2ZXJzaW9uICBSIHZlcnNpb24gNC4zLjMgKDIwMjQtMDItMjkpCiMjICBvcyAgICAgICBtYWNPUyBTb25vbWEgMTQuNQojIyAgc3lzdGVtICAgeDg2XzY0LCBkYXJ3aW4yMAojIyAgdWkgICAgICAgWDExCiMjICBsYW5ndWFnZSAoRU4pCiMjICBjb2xsYXRlICBlbl9VUy5VVEYtOAojIyAgY3R5cGUgICAgZW5fVVMuVVRGLTgKIyMgIHR6ICAgICAgIEFtZXJpY2EvTmV3X1lvcmsKIyMgIGRhdGUgICAgIDIwMjQtMDQtMDQKIyMgIHBhbmRvYyAgIDMuMS4xIEAgL0FwcGxpY2F0aW9ucy9SU3R1ZGlvLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvYXBwL3F1YXJ0by9iaW4vdG9vbHMvICh2aWEgcm1hcmtkb3duKQojIyAKIyMg4pSAIFBhY2thZ2VzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAojIyAgcGFja2FnZSAgICAgICAgICAgKiB2ZXJzaW9uIGRhdGUgKFVUQykgbGliIHNvdXJjZQojIyAgYXNrcGFzcyAgICAgICAgICAgICAxLjIuMCAgIDIwMjMtMDktMDMgWzJdIENSQU4gKFIgNC4zLjApCiMjICBib29rZG93biAgICAgICAgICAqIDAuMzguMSAgMjAyNC0wMy0yNiBbMl0gR2l0aHViIChyc3R1ZGlvL2Jvb2tkb3duQDUwYTFjMWUpCiMjICBic2xpYiAgICAgICAgICAgICAgIDAuNi4yICAgMjAyNC0wMy0yMiBbMl0gQ1JBTiAoUiA0LjMuMikKIyMgIGNhY2hlbSAgICAgICAgICAgICAgMS4wLjggICAyMDIzLTA1LTAxIFsyXSBDUkFOIChSIDQuMy4wKQojIyAgY2hyb21vdGUgICAgICAgICAgICAwLjIuMCAgIDIwMjQtMDItMTIgWzFdIENSQU4gKFIgNC4zLjIpCiMjICBjbGkgICAgICAgICAgICAgICAgIDMuNi4yICAgMjAyMy0xMi0xMSBbMl0gQ1JBTiAoUiA0LjMuMCkKIyMgIGNvbG9yc3BhY2UgICAgICAgICAgMi4xLTAgICAyMDIzLTAxLTIzIFsyXSBDUkFOIChSIDQuMy4wKQojIyAgY3JheW9uICAgICAgICAgICAgICAxLjUuMiAgIDIwMjItMDktMjkgWzJdIENSQU4gKFIgNC4zLjApCiMjICBjcnVsICAgICAgICAgICAgICAgIDEuNC4wICAgMjAyMy0wNS0xNyBbMl0gQ1JBTiAoUiA0LjMuMCkKIyMgIGN1cmwgICAgICAgICAgICAgICAgNS4yLjEgICAyMDI0LTAzLTAxIFsyXSBDUkFOIChSIDQuMy4yKQojIyAgZGF0YS50YWJsZSAgICAgICAgICAxLjE1LjQgIDIwMjQtMDMtMzAgWzFdIENSQU4gKFIgNC4zLjIpCiMjICBkaWdlc3QgICAgICAgICAgICAgIDAuNi4zNSAgMjAyNC0wMy0xMSBbMl0gQ1JBTiAoUiA0LjMuMikKIyMgIGV2YWx1YXRlICAgICAgICAgICAgMC4yMyAgICAyMDIzLTExLTAxIFsyXSBDUkFOIChSIDQuMy4wKQojIyAgZmFzdG1hcCAgICAgICAgICAgICAxLjEuMSAgIDIwMjMtMDItMjQgWzJdIENSQU4gKFIgNC4zLjApCiMjICBmbGV4dGFibGUgICAgICAgICAqIDAuOS41ICAgMjAyNC0wMy0wNiBbMV0gQ1JBTiAoUiA0LjMuMikKIyMgIGZvbnRCaXRzdHJlYW1WZXJhICAgMC4xLjEgICAyMDE3LTAyLTAxIFsyXSBDUkFOIChSIDQuMy4wKQojIyAgZm9udExpYmVyYXRpb24gICAgICAwLjEuMCAgIDIwMTYtMTAtMTUgWzJdIENSQU4gKFIgNC4zLjApCiMjICBmb250cXVpdmVyICAgICAgICAgIDAuMi4xICAgMjAxNy0wMi0wMSBbMl0gQ1JBTiAoUiA0LjMuMCkKIyMgIGZvcm1hdFIgICAgICAgICAgICogMS4xNCAgICAyMDIzLTAxLTE3IFsyXSBDUkFOIChSIDQuMy4wKQojIyAgZ2R0b29scyAgICAgICAgICAgICAwLjMuNyAgIDIwMjQtMDMtMDUgWzJdIENSQU4gKFIgNC4zLjIpCiMjICBnZm9udHMgICAgICAgICAgICAgIDAuMi4wICAgMjAyMy0wMS0wOCBbMl0gQ1JBTiAoUiA0LjMuMCkKIyMgIGdsdWUgICAgICAgICAgICAgICAgMS43LjAgICAyMDI0LTAxLTA5IFsyXSBDUkFOIChSIDQuMy4wKQojIyAgaHRtbHRvb2xzICAgICAgICAgICAwLjUuOCAgIDIwMjQtMDMtMjUgWzJdIENSQU4gKFIgNC4zLjIpCiMjICBodHRwY29kZSAgICAgICAgICAgIDAuMy4wICAgMjAyMC0wNC0xMCBbMl0gQ1JBTiAoUiA0LjMuMCkKIyMgIGh0dHB1diAgICAgICAgICAgICAgMS42LjE1ICAyMDI0LTAzLTI2IFsyXSBDUkFOIChSIDQuMy4yKQojIyAganF1ZXJ5bGliICAgICAgICAgICAwLjEuNCAgIDIwMjEtMDQtMjYgWzJdIENSQU4gKFIgNC4zLjApCiMjICBqc29ubGl0ZSAgICAgICAgICAgIDEuOC44ICAgMjAyMy0xMi0wNCBbMl0gQ1JBTiAoUiA0LjMuMCkKIyMgIGthYmxlRXh0cmEgICAgICAgICogMS40LjAgICAyMDI0LTAxLTI0IFsxXSBDUkFOIChSIDQuMy4yKQojIyAga25pdHIgICAgICAgICAgICAgKiAxLjQ1ICAgIDIwMjMtMTAtMzAgWzFdIENSQU4gKFIgNC4zLjApCiMjICBsYXRlciAgICAgICAgICAgICAgIDEuMy4yICAgMjAyMy0xMi0wNiBbMl0gQ1JBTiAoUiA0LjMuMCkKIyMgIGxpZmVjeWNsZSAgICAgICAgICAgMS4wLjQgICAyMDIzLTExLTA3IFsyXSBDUkFOIChSIDQuMy4wKQojIyAgbWFncml0dHIgICAgICAgICAgICAyLjAuMyAgIDIwMjItMDMtMzAgWzJdIENSQU4gKFIgNC4zLjApCiMjICBtaW1lICAgICAgICAgICAgICAgIDAuMTIgICAgMjAyMS0wOS0yOCBbMl0gQ1JBTiAoUiA0LjMuMCkKIyMgIG11bnNlbGwgICAgICAgICAgICAgMC41LjEgICAyMDI0LTA0LTAxIFsxXSBDUkFOIChSIDQuMy4yKQojIyAgb2ZmaWNlciAgICAgICAgICAgICAwLjYuNSAgIDIwMjQtMDItMjQgWzJdIENSQU4gKFIgNC4zLjIpCiMjICBvcGVuc3NsICAgICAgICAgICAgIDIuMS4xICAgMjAyMy0wOS0yNSBbMl0gQ1JBTiAoUiA0LjMuMCkKIyMgIHByb2Nlc3N4ICAgICAgICAgICAgMy44LjQgICAyMDI0LTAzLTE2IFsyXSBDUkFOIChSIDQuMy4yKQojIyAgcHJvbWlzZXMgICAgICAgICAgICAxLjIuMSAgIDIwMjMtMDgtMTAgWzJdIENSQU4gKFIgNC4zLjApCiMjICBwcyAgICAgICAgICAgICAgICAgIDEuNy42ICAgMjAyNC0wMS0xOCBbMl0gQ1JBTiAoUiA0LjMuMCkKIyMgIFI2ICAgICAgICAgICAgICAgICAgMi41LjEgICAyMDIxLTA4LTE5IFsyXSBDUkFOIChSIDQuMy4wKQojIyAgcmFnZyAgICAgICAgICAgICAgICAxLjMuMCAgIDIwMjQtMDMtMTMgWzJdIENSQU4gKFIgNC4zLjIpCiMjICBSY3BwICAgICAgICAgICAgICAgIDEuMC4xMiAgMjAyNC0wMS0wOSBbMl0gQ1JBTiAoUiA0LjMuMCkKIyMgIHJsYW5nICAgICAgICAgICAgICAgMS4xLjMgICAyMDI0LTAxLTEwIFsyXSBDUkFOIChSIDQuMy4wKQojIyAgcm1hcmtkb3duICAgICAgICAgKiAyLjI2LjEgIDIwMjQtMDMtMjYgWzJdIEdpdGh1YiAocnN0dWRpby9ybWFya2Rvd25AZWU2OWQ1OSkKIyMgIHJzdHVkaW9hcGkgICAgICAgICAgMC4xNi4wICAyMDI0LTAzLTI0IFsyXSBDUkFOIChSIDQuMy4yKQojIyAgc2FzcyAgICAgICAgICAgICAgICAwLjQuOSAgIDIwMjQtMDMtMTUgWzJdIENSQU4gKFIgNC4zLjIpCiMjICBzY2FsZXMgICAgICAgICAgICAgIDEuMy4wICAgMjAyMy0xMS0yOCBbMl0gQ1JBTiAoUiA0LjMuMCkKIyMgIHNlc3Npb25pbmZvICAgICAgICAgMS4yLjIgICAyMDIxLTEyLTA2IFsyXSBDUkFOIChSIDQuMy4wKQojIyAgc2hpbnkgICAgICAgICAgICAgICAxLjguMSAgIDIwMjQtMDMtMjYgWzJdIENSQU4gKFIgNC4zLjIpCiMjICBzdHJpbmdpICAgICAgICAgICAgIDEuOC4zICAgMjAyMy0xMi0xMSBbMl0gQ1JBTiAoUiA0LjMuMCkKIyMgIHN0cmluZ3IgICAgICAgICAgICAgMS41LjEgICAyMDIzLTExLTE0IFsyXSBDUkFOIChSIDQuMy4wKQojIyAgc3ZnbGl0ZSAgICAgICAgICAgICAyLjEuMyAgIDIwMjMtMTItMDggWzFdIENSQU4gKFIgNC4zLjApCiMjICBzeXN0ZW1mb250cyAgICAgICAgIDEuMC42ICAgMjAyNC0wMy0wNyBbMl0gQ1JBTiAoUiA0LjMuMikKIyMgIHRleHRzaGFwaW5nICAgICAgICAgMC4zLjcgICAyMDIzLTEwLTA5IFsyXSBDUkFOIChSIDQuMy4wKQojIyAgdGlueXRleCAgICAgICAgICAgKiAwLjUwICAgIDIwMjQtMDMtMTYgWzJdIENSQU4gKFIgNC4zLjIpCiMjICB1dWlkICAgICAgICAgICAgICAgIDEuMi0wICAgMjAyNC0wMS0xNCBbMl0gQ1JBTiAoUiA0LjMuMCkKIyMgIHZpcmlkaXNMaXRlICAgICAgICAgMC40LjIgICAyMDIzLTA1LTAyIFsyXSBDUkFOIChSIDQuMy4wKQojIyAgd2Vic2hvdCAgICAgICAgICAgKiAwLjUuNSAgIDIwMjMtMDYtMjYgWzFdIENSQU4gKFIgNC4zLjApCiMjICB3ZWJzaG90MiAgICAgICAgICAqIDAuMS4xICAgMjAyMy0wOC0xMSBbMV0gQ1JBTiAoUiA0LjMuMCkKIyMgIHdlYnNvY2tldCAgICAgICAgICAgMS40LjEgICAyMDIxLTA4LTE4IFsxXSBDUkFOIChSIDQuMy4wKQojIyAgeGZ1biAgICAgICAgICAgICAgICAwLjQzICAgIDIwMjQtMDMtMjUgWzJdIENSQU4gKFIgNC4zLjIpCiMjICB4bWwyICAgICAgICAgICAgICAgIDEuMy42ICAgMjAyMy0xMi0wNCBbMl0gQ1JBTiAoUiA0LjMuMCkKIyMgIHh0YWJsZSAgICAgICAgICAgICAgMS44LTQgICAyMDE5LTA0LTIxIFsyXSBDUkFOIChSIDQuMy4wKQojIyAgeWFtbCAgICAgICAgICAgICAgICAyLjMuOCAgIDIwMjMtMTItMTEgWzJdIENSQU4gKFIgNC4zLjApCiMjICB6aXAgICAgICAgICAgICAgICAgIDIuMy4xICAgMjAyNC0wMS0yNyBbMl0gQ1JBTiAoUiA0LjMuMikKIyMgCiMjICBbMV0gL1VzZXJzL3NsYWFuMy9MaWJyYXJ5L1IveDg2XzY0LzQuMy9saWJyYXJ5CiMjICBbMl0gL0xpYnJhcnkvRnJhbWV3b3Jrcy9SLmZyYW1ld29yay9WZXJzaW9ucy80LjMteDg2XzY0L1Jlc291cmNlcy9saWJyYXJ5CiMjIAojIyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKYGBgCgo8IS0tIGBgYHtqcywgZWNobyA9IEZBTFNFfSAtLT4KPCEtLSB0aXRsZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhZGVyJyk7IC0tPgo8IS0tIHRpdGxlLmlubmVySFRNTCA9ICc8aW1nIHNyYz0iaW1nL19oZWFkZXJzL2Jhbm5lcl9tYW5fc3RhbmRpbmdfZG5hLnBuZyIgYWx0PSJDb2xvZm9uIj4nICsgdGl0bGUuaW5uZXJIVE1MIC0tPgo8IS0tIGBgYCAtLT4KCjwhLS0gZXhhbXBsZTogaHR0cHM6Ly95ZWFyYm9va2Rpc2NvdmVyaWVzLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAxNC8wNS9Xcml0aW5nX2FfWWVhcmJvb2tfQ29sb3Bob24ucGRmIC0tPgo8IS0tIFNQRUNJQUwgVEhBTktTOiAoVGhlIHN0YWZmIHdyb3RlIGEgZmV3IHBhcmFncmFwaHMgYWJvdXQgdGhlIHllYXIgYW5kIG1lbnRpb25lZCBhIHZhcmlldHkgLS0+CjwhLS0gb2YgcGVvcGxlIHdobyB3ZXJlIGluc3RydW1lbnRhbCBpbiB0aGUgc3VjY2VzcyBvZiB0aGVpciB5ZWFyYm9vay4pIC0tPgo8IS0tIENPVkVSICYgRU5EU0hFRVRTOiBUaGUgMjAxMyBQaW5uYWNsZSBjb3ZlciBpcyBhIGZvdXItY29sb3IgbGl0aG9ncmFwaC4gQW4gaXJpZGVzY2VudCBmb2lsIC0tPgo8IS0tIGNvdmVycyBhIHBvcnRpb24gb2YgdGhlIHRoZW1lIGRlc2lnbi4gVGhlIGVuZHNoZWV0cyBhcmUgc3RhbmRhcmQgc3RvY2sgcGFwZXIuIFRoZSB0aGVtZSAtLT4KPCEtLSBjb25jZXB0IHdhcyBjcmVhdGVkIGFuZCBleHBhbmRlZCBieSB0aGUgZWRpdG9yaWFsIHRlYW0gYW5kIG1lbWJlcnMgb2YgdGhlIDIwMTMgUGlubmFjbGUgLS0+CjwhLS0gc3RhZmYuIENvdmVyIGFuZCBlbmRzaGVldHMgd2VyZSBkZXNpZ25lZCBieSBQaW5uYWNsZSBjby1lZGl0b3JzLWluLWNoaWVmIFJlZ2FuIEJyb3duIGFuZCAtLT4KPCEtLSBFbGxlbmEgU3VsbGl2YW4sIHdpdGggaW5zcGlyYXRpb24gcHJvdmlkZWQgYnkgYW4gZWFybHkgZGVzaWduIGZyb20gY28tcmVmZXJlbmNlIGVkaXRvciAtLT4KPCEtLSBBbWFuZGEgRmFycmVyLiAtLT4KPCEtLSBUWVBFICYgQ09MT1IgVFJFQVRNRU5UOiBCb2R5IGNvcHkgdGhyb3VnaG91dCB0aGUgYm9vayBpcyBzZXQgaW4gRnJ1dGlnZXIgTGlnaHQgLS0+CjwhLS0gQ29uZGVuc2VkICg4LjUgcHQuKSBDYXB0aW9ucyBhcmUgc2V0IGluIEZydXRpZ2VyIExpZ2h0IENvbmRlbnNlZCAoNy41IHB0LikgSGVhZGxpbmUgLS0+CjwhLS0gdHJlYXRtZW50cyBhcmUgZGVzaWduZWQgd2l0aCB2YXJpYXRpb25zIG9mIEFISiBOYXNodmlsbGUsIEFybm8gUHJvIGFuZCBGcnV0aWdlci4gUGhvdG8gLS0+CjwhLS0gY3JlZGl0cyBhbmQgc3ByZWFkIGNyZWRpdHMgYXBwZWFyIGluIEZydXRpZ2VyIEl0YWxpYyAoNiBwdC4pIC0tPgo8IS0tIEZvciBjb25zaXN0ZW5jeSwgYSBjb2xvciBwYWxldHRlIHdhcyBjaG9zZW4uIEluIGFkZGl0aW9uIHRvIHRoZSB0cmFkaXRpb25hbCBibGFjaywgdGhlIC0tPgo8IS0tIGZvbGxvd2luZyBjb2xvcnMgYXBwZWFyIHRocm91Z2hvdXQgdGhlIHB1YmxpY2F0aW9uOiBQYW50b25lIDE1MUMsIFBhbnRvbmUgMzAwNUMsIFBhbnRvbiAtLT4KPCEtLSAyOTg1QywgUGFudG9uZSAxMTVDLCBQYW50b25lIDM3NkMsIFBhbnRvbmUgMzYzQywgUGFudG9uZSAyNjZDLCBQYW50b25lIDE4NUMgYW5kIC0tPgo8IS0tIFBhbnRvbmUgQ29vbCBHcmV5IDdDLiAtLT4KPCEtLSBQVUJMSVNISU5HOiBWb2x1bWUgMTA3IG9mIHRoZSBQaW5uYWNsZSB3YXMgZGVzaWduZWQgYW5kIHByb2R1Y2VkIGJ5IHRoZSAyMDEzIFBpbm5hY2xlIC0tPgo8IS0tIHN0YWZmLiBUaGUgNDU2LXBhZ2UsIGFsbC1jb2xvciBQaW5uYWNsZSBpcyBwcmludGVkIG9uIDgwIGxiLiBnbG9zcyBwYXBlciBieSBIZXJmZiBKb25lcyAtLT4KPCEtLSBQdWJsaXNoaW5nIENvLiBpbiBLYW5zYXMgQ2l0eSwgTU8uIEFwcHJveGltYXRlbHkgMywwMDAgY29waWVzIHdlcmUgcHJlLW9yZGVyZWQgZm9yICQ1Mi4gLS0+CjwhLS0gQW55IGV4dHJhIGNvcGllcyB3ZXJlIHNvbGQgZm9yICQ2MC4gQSA0OC1wYWdlIHN1cHBsZW1lbnQgd2FzIGluY2x1ZGVkIGluIHRoaXMgcHJpY2UuIFRoZSAtLT4KPCEtLSBwdWJsaWNhdGlvbiB3YXMgY3JlYXRlZCB1c2luZyBBZG9iZSBDUzUuNSBzb2Z0d2FyZSBvbiA0MiBNYWNpbnRvc2ggZGVza3RvcCBhbmQgbGFwdG9wIC0tPgo8IS0tIGNvbXB1dGVycy4gLS0+CjwhLS0gUEhPVE9HUkFQSFk6IFBpbm5hY2xlIHN0YWZmIHBob3RvZ3JhcGhlcnMgc2hvdCBkaWdpdGFsIHBob3RvcyB1c2luZyBmb3VyIE5pa29uIEQ3MHMsIC0tPgo8IS0tIHR3byBOaWtvbiBEODBzIGFuZCBvbmUgTmlrb24gRDQwLiBTcG9ydCBncm91cCBwaG90b3Mgd2VyZSBzaG90IGJ5IFByZXN0aWdlIFBvcnRyYWl0cywgLS0+CjwhLS0gYW5kIGNsdWIgYW5kIGdyb3VwIHBob3RvcyB3ZXJlIHNob3QgYnkgYm90aCBQcmVzdGlnZSBQb3J0cmFpdHMgYW5kIFBpbm5hY2xlIHllYXJib29rIHN0YWZmIC0tPgo8IS0tIHBob3RvZ3JhcGhlcnMuIFNvbWUgc3VibWl0dGVkIHBob3RvcyBhcHBlYXIgdGhyb3VnaG91dCB0aGUgYm9vayBhcyB3ZWxsLiAtLT4KPCEtLSBFRElUT1JT4oCZIE5PVEU6IChBIHNwZWNpYWwgbm90ZSBmcm9tIHRoZSBjby1lZGl0b3JzLWluLWNoaWVmIHdhcyBpbmNsdWRlZCBoZXJlLiBUaGUgeWVhcmJvb2sgLS0+CjwhLS0gc3RhZmYgcGhvdG8gd2l0aCBuYW1lcyBhbmQgc3RhZmYgcG9zaXRpb25zIHdhcyBpbmNsdWRlZCBvbiB0aGUgc3ByZWFkIHdpdGggdGhlIGNvbG9waG9uLikgLS0+Cgo8IS0tY2hhcHRlcjplbmQ6MTJfY29sb3Bob24uUm1kLS0+CgoKIyBSZWZlcmVuY2VzIHstfQoKCjwhLS1jaGFwdGVyOmVuZDoxM19yZWZlcmVuY2VzLlJtZC0tPgoK